推荐阅读
本系列其他文章
参考教程
前言
本篇文章将介绍图像的形态学变换。
形态学变换
简介
形态学是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。
常见图像形态学运算:腐蚀、膨胀、开运算、闭运算、骨架抽取、极线腐蚀、击中击不中变换、Top-hat变换、颗粒分析、流域变换、形态学梯度等。
形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
本文的形态学内容仅讨论腐蚀、膨胀、开运算、闭运算。
数学基础
形态学的数学基础和所用语言是集合论。
结构元素
结构元素(Structuring Elements,SE)是类似于“滤波核”的元素,或者说类似于一个“小窗”,在原图上进行“滑动”,在腐蚀与膨胀操作中都需要用到。
结构元素可以指定其形状和大小。结构元素一般由0和1的二值像素组成。结构元素的原点**(锚点)**相当于“小窗”的中心,其尺寸由具体的腐蚀或膨胀算子指定,结构元素的尺寸也决定着腐蚀或者膨胀的程度。结构元素越大,被腐蚀消失或者被膨胀增加的区域也会越大。
在matlab中创建结构元
基本语法
SE = strel(shape, parameters)
关于strel的相关参数说明请自行查阅官方文档:Morphological structuring element - MATLAB - MathWorks 中国
示例
close all;clc;clear;
SE = strel('diamond',100);
figure();imshow(SE.Neighborhood);
腐蚀与膨胀
腐蚀和膨胀是两种最基本也是最重要的形态学运算, 它们是很多高级形态学处理的基础, 很多其他的形态学算法都是由这两种基本运算复合而成。
注:以下图示部分来自于图像算法原理与实践——图像形态学处理 - 知乎 (zhihu.com)
腐蚀
将结构元s在图像f上滑动,把结构元锚点位置对应图像像素点位置,目标像素点的灰度值设置为结构元值为1的区域对应图像区域像素的最小值。腐蚀可用于消除边缘和杂点。
腐蚀运算用公式符号记为: f ⊖ s f\ominus s f⊖s
简单来说就是求局部最小值。直观视觉就是图像中物体尺寸会瘦小,看起来好像被腐蚀了。
示例
close all;clc;clear;
I = imread('example2.jpg');
I = rgb2gray(I);
figure();imshow(I);title("original");
SE = strel('diamond',10);
X = imerode(I,SE);
figure();imshow(X);title("imerode");
图像也可以是彩色。
膨胀
将结构元s在图像f上滑动,把结构元锚点位置对应图像像素点位置,目标像素点的灰度值设置为结构元值为1的区域对应图像区域像素的最大值。经过膨胀操作,图像区域的边缘可能会变得平滑,区域的像素将会增加,不相连的部分可能会连接起来。
膨胀运算用公式符号记为: f ⊕ s f\oplus s f⊕s
示例
close all;clc;clear;
I = imread('example2.jpg');
I = rgb2gray(I);
figure();imshow(I);title("original");
SE = strel('diamond',10);
X = imdilate(I,SE);
figure();imshow(X);title("imdilate");
开运算与并运算
开运算
对图像 f 用同一结构元 s 先腐蚀 再膨胀称之为开运算。记为: ( f ⊖ s ) ⊕ s (f\ominus s)\oplus s (f⊖s)⊕s
基本功能
消除小物体;在纤细处分离物体;平滑较大的边界并不明显改变其面积。从视觉上看仿佛将原本连接的物体“分开”了一样。
示例
close all;clc;clear;
I = imread('example2.jpg');
%I = rgb2gray(I);
figure();imshow(I);title("original");
SE = strel('diamond',10);
X = imopen(I,SE);
figure();imshow(X);title("imopen");
并运算
图像 f 用同一结构元 s 先膨胀 再腐蚀 称之为闭运算。记为: ( f ⊕ s ) ⊖ s (f\oplus s)\ominus s (f⊕s)⊖s
基本功能
排除小型黑洞,从视觉上看仿佛将原本分开的部分“闭合”了一样。
示例
close all;clc;clear;
I = imread('example2.jpg');
%I = rgb2gray(I);
figure();imshow(I);title("original");
SE = strel('diamond',10);
X = imclose(I,SE);
figure();imshow(X);title("imclose");