我们为什么要用形态学滤波
- 消除噪声
- 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
- 寻找图像中的明显的极大值区域或极小值区域
- 求出图像的梯度
原图:
图片来源网络,如有侵权及时告知删改。
膨胀,腐蚀
首先,膨胀和腐蚀是形态学处理图像的基本操作。
膨胀:(dilate)
是针对高光区域进行膨胀,类似与领域扩张,效果图拥有比原图更大的高光区域。
原理:
膨胀就是求局部最大值的操作,卷积核与图形卷积,即计算核覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。
效果图:
不难看到与原图相比高光区域扩张了。
API函数使用:
dilate(g_srcImage, g_dstImage, element);
这里第三个参数是利用了getStructuringElement函数作为参数返回。其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 椭圆形: MORPH_ELLIPSE
而getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。
使用如下:
Mat element = getStructuringElement(MORPH_RECT,
Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),
Point( g_nStructElementSize, g_nStructElementSize ));
腐蚀:(erode)
原图像的亮部区域被腐蚀,类似领域蚕食,与原图相比亮部区域会减少。
原理:与膨胀相反,除求的是最小值,其他基本相同。
效果图:
可以看见暗部扩张了。
API函数使用:(这里的element与上面相同)
erode(g_srcImage, g_dstImage, element);
开运算、闭运算
开运算:
先腐蚀后膨胀。开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
效果图:
可以看见,橙子皮上小颗粒被消除了,但是由于是先腐蚀导致暗部变大在膨胀来调节导致效果图会偏暗。不过边界被很好保存,没改变面积。
使用:
morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element);
morphologyEx这个是个函数这里就不介绍。
闭运算:
先膨胀后腐蚀的过程称为闭运算(Closing Operation),闭运算能够排除小型黑洞(黑色区域)
效果图:
可以发现小型黑色区域被消除,这是因为先膨胀调大高亮区域,再腐蚀调和。
使用:
morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element);
顶帽、黑帽
顶帽:
为原图像与上文刚刚介绍的“开运算“的结果图之差,因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域
效果图:
黑帽:
黑帽(Black Hat)运算为”闭运算“的结果图与原图像之差,黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域。
注意比较顶帽和黑帽突出的区域。再看原图,看轮廓周围的区域