此系列的其他文章:
OpenCV算法学习笔记之初识OpenCV
OpenCV算法学习笔记之几何变换
OpenCV算法学习笔记之对比度增强
OpenCV算法学习笔记之平滑算法
OpenCV算法学习笔记之阈值分割
OpenCV算法学习笔记之边缘检测(一)
OpenCV算法学习笔记之边缘处理(二)
OpenCV算法学习笔记之形状检测
更多文章可以访问我的博客Aengus | Blog
形态学处理最初是数学集合论发展来的并且用于处理二值图的,后来将这些方法推广到普通的灰度级图像处理中。常用的形态学处理有腐蚀、膨胀、开运算、闭运算、顶帽运算、底帽运算。其中腐蚀和膨胀是基本操作,其他几个操作都可以由这两个操作组合得到。
腐蚀
原理
我们在之前的中值模糊中将某个位置的邻域的灰度值进行排序,然后取中值作为这个位置的灰度值。而腐蚀操作与此类似,是取邻域的最小值作为其输出值。不同的是这里的邻域不再是单纯的矩形,也可以是椭圆形、十字交叉型等,在其他的描述中这个邻域可能叫做结构元,只是用来指明邻域形状的不同,与卷积和类似,它同样需要指定一个锚点。
因为取每个位置邻域内的的最小值,所以腐蚀后的总体亮度的平均值会比原图低,图像中比较亮的区域的面积会变小甚至消失,而比较暗的区域的面积会增大,我们将图像与腐蚀结构元的腐蚀操作记为:
实现
对于图像的腐蚀操作,OpenCV提供函数erode(src, element[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
实现了该功能:
参数 | 解释 |
---|---|
src | 输入矩阵 |
element | 结构元 |
anchor | 结构元的锚点 |
iterations | 腐蚀操作的次数 |
borderType | 边界扩充类型 |
borderValue | 边界扩充值 |
与卷积操作类似,对于边界处的像素的邻域有可能超过图像边界,所以需要扩充边界,边界扩充类型与图像平滑中提到的相同,其中镜像扩充的效果是最好的。对于函数erode
最常调节的是element
和iterations
,其他参数采用默认的即可,结构元element
可以利用OpenCV提供的函数getStructuringElement(shape, ksize[, anchor, ])
,参数解释下表所示:
参数 | 解释 |
---|---|
shape | MORPH_RECT: 产生矩形的结构元 MORPH_ELLIPSE: 产生的椭圆形的结构元 MORPH_CROSS: 产生的十字交叉型的结构元 |
ksize | 结构元的尺寸 |
anchor | 结构元的锚点 |
膨胀
原理
与腐蚀相反,膨胀是取每一个位置邻域内的最大值,同样,邻域的形状由结构元确定。膨胀后的图像总体亮度的平均值比原图会有所上升,图像中较亮的物体的尺寸会变大,相反,较暗的物体的尺寸会变小甚至消失。图像与结构元的膨胀操作记为:
实现
OpenCV提供函数dilate(src, element[, dst[, anchor[, iterations[, borderType[, borderValue ]]]]])
实现了膨胀操作,其参数的设置与函数erode
一样的。
开运算和闭运算
开运算
先腐蚀后膨胀的操作叫做开运算,即
它具有消除亮度较高的细小区域,在纤细处分离物体,对于较大的物体,可以在不明显改变其面积的情况下平滑其边界等作用。
开运算还有一个很重要的作用:消除暗背景下的较亮区域。
闭运算
先膨胀后腐蚀的操作叫做闭运算,记作
它具有填充白色物体内细小黑色空洞的区域,连接临近物体,同一个结构元、多次迭代处理也可以在不明显其面积的情况下平滑其边界的作用。
实现
OpenCV提供函数morphologyEx(src, op, element[, dst[, anchor[, iterations[, borderType[, borderValue ]]]]])
实现了形态学处理,其中参数op
如下所示:
enum MorphTypes{
MORPH_ERODE = 0, // 腐蚀
MORPH_DILATE = 1, // 膨胀
MORPH_OPEN = 2, // 开运算
MORPH_CLOSE = 3, // 闭运算
MORPH_GRADIENT = 4 // 形态梯度,膨胀图减腐蚀图
MORPH_TOPHAT = 5, // 顶帽运算
MORPH_BLACKHAT = 6, // 底帽运算
MORPH_HITMISS = 7 // Hit-or-Miss运算(也称作Hit-and-Miss运算)
};
顶帽变换和底帽变换
顶帽运算
图像减去开运算的结果称为顶帽变换:
由于开运算可以消除较暗背景下的较亮区域,那么用原图减开运算后的结果就可以得到原图中灰度较亮的区域,所以也称作白顶帽运算。
底帽运算
闭运算减去图像的结果称作底帽运算:
闭运算可以删去亮度较高背景下的较暗区域,那么用闭运算的结果减去原图就可以得到原图中灰度较暗的区域,所以又称作黑底帽运算。
Hit-or-Miss变换
中文直译过来就是击中和击不中变换,是指用一个结构元与图像进行匹配,保留完全匹配的模板的锚点作为结果的一个元素,得到的结果为击中结果;然后再用一个击不中结构元与图像的补集进行匹配,保留完全匹配的模板的锚点作为结果的一个元素,得到的结果记为击不中结果。两者取交集就是HITMISS结果,步骤为
- 使用击中模板与原图进行匹配;
- 使用击不中模板与原图的补进行匹配;
- 对1,2步骤得到的结果取交集;
OpenCV提供的函数morphologyEx
进行HITMISS变换只能对数据类型为CV_8UC1
的二值图进行处理;
参考
《OpenCV算法精解——基于Python和C++》(张平)第七章