- 常用的形态学处理方法包括:腐蚀、膨胀、开运算、闭运算、顶帽运算、底帽运算,其中腐蚀和膨胀是最基础的方法,其他方法是两者相互组合产生的。
1.腐蚀
- 图像的腐蚀操作与中值平滑操作类似,取每一个位置的矩形邻域内最小值作为该位置输出的灰度值。不同的是,这里的邻域不再是单纯的矩形结构,也可以是椭圆形结构、十字交叉型结构等。
- 因为取每个邻域内的最小值,所以腐蚀后输出图像总体亮度平均值比起原图会有所降低,图像中比较亮的区域面积会变小甚至消失,而比较暗的区域面积会增大。图像 I I I与结构元 S S S的腐蚀操作记为:
E = I ⊖ S E=I\ominus S E=I⊖S
erode(src, element[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])//腐蚀操作
//src-输入矩阵
//element-结构元
//anchor-结构元的锚点
//iterations-腐蚀操作次数
//borderType-边界扩充类型
//borderValue-边界扩充值
getStructuringElement(shape, ksize[, anchor])//产生结构元
//shape-结构元形状
// MORPH_RECT 产生矩形结构元
// MORPH_ELLIPSEM 产生椭圆形结构元
// MORPH_CROSS 产生十字交叉形结构元
//ksize-结构元尺寸
//anchor-结构元锚点
2.膨胀
- 与中值平滑和腐蚀操作类似,膨胀取每一个位置邻域内的最大值。膨胀后的输出图像总体亮度平均值比起原图会有所上升,图像中较亮物体尺寸会变大。图像 I I I与结构元 S S S的膨胀操作记为:
D = I ⊕ S D=I\oplus S D=I⊕S
dilate(src, element[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])//膨胀操作
3.开运算和闭运算
- 开运算:先腐蚀后膨胀
I ∘ S = ( I ⊖ S ) ⊕ S I\circ S=(I\ominus S)\oplus S I∘S=(I⊖S)⊕S
具有消除亮度较高的细小区域、在纤细点处分离物体,对于较大物体,可以在不明显改变其面积的情况下平滑其边界等作用。 - 闭运算:先膨胀后腐蚀
I ∙ S = ( I ⊕ S ) ⊖ S I\bullet S=(I\oplus S)\ominus S I∙S=(I⊕S)⊖S
具有填充白色物体内细小黑色空洞的区域、连接临近物体、同一个结构元、多次迭代处理,也可以在不明显改变其面积的情况下平滑其边界等作用。
morphologyEx(src, op, element[, dst[, anchor[, iterations[, borderType[, borderValue ]]]]]))
//op-形态学处理各种运算
// MORPH_OPEN 开运算
// MORPH_CLOSE 闭运算
// MORPH_GRADIENT 形态梯度
// MORPH_TOPHAT 顶帽运算
// MORPH_BLACKHAT 底帽运算
4.其他形态学处理操作
-
顶帽变换和底帽变换分别以开运算和闭运算为基础。
-
顶帽变换:图像减去开运算结果
T h a t ( I ) = I − I ∘ S T_{hat}(I)=I-I\circ S That(I)=I−I∘S
开运算可以消除背景下的较亮区域,用原图减去开运算结果可以得到原图中灰度较亮的区域,所以又称白底帽变换,还可以校正不均匀光照。 -
底帽变换:图像减去闭运算结果
B h a t ( I ) = I ∙ S − I B_{hat}(I)=I\bullet S-I Bhat(I)=I∙S−I
闭运算可以删除亮度较高背景下的较暗区域,用原图减去闭运算结果可以得到原图中灰度较暗的区域,所以又称黑底帽变换。 -
形态学梯度
G = I ⊕ S − I ⊖ S G=I\oplus S-I\ominus S G=I⊕S−I⊖S
即膨胀结果减去腐蚀结果,膨胀增大亮度高的区域面积,腐蚀减小亮度高的区域面积,所以 G ( r , c ) ≥ 0 G(r,c)\geq 0 G(r,c)≥0,且得到的便是图像中物体的边界。