上一节我们学习了形态学的基本操作,即图像的腐蚀与膨胀,那么,本节我们一起来学习更高级的形态学操作。
一、形态学操作 --- 开运算
开运算(Opening Operation),其实就是先腐蚀后膨胀的过程。
其数学表达式如下:
实例:
实验结果:
2 、形态学操作 --- 闭运算
先膨胀后腐蚀的过程称为闭运算(Closing Operation)。
其数学表达式如下:
实例:
实验结果:
三、形态学梯度
形态学梯度(Morphological Gradient)为膨胀图与腐蚀图之差。
数学表达式如下:
对二值图像进行这一操作可以将团块(blob)的边缘突出出来,我们可以用形态学梯度来保留物体的边缘轮廓。
函数原型:
函数功能:
morphologyEx函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,如开闭运算,形态学梯度,“顶帽”、“黑帽”等等。
参数详解:
- 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F;
- 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型;
- 第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
- MORPH_OPEN – 开运算(Opening operation)
- MORPH_CLOSE – 闭运算(Closing operation)
- MORPH_GRADIENT -形态学梯度(Morphological gradient)
- MORPH_TOPHAT - “顶帽”(“Top hat”)
- MORPH_BLACKHAT - “黑帽”(“Black hat“)
- 第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵);
- 第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心;
- 第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1;
- 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT;
- 第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。
实例:
实验结果:
四、形态学操作 --- 顶帽
顶帽运算(Top Hat)又常常被译为”礼帽“运算。为原图像与上文刚刚介绍的“开运算“的结果图之差,数学表达式如下:
因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
实例--核心代码:
实验结果:
五、形态学操作 --- 黑帽
黑帽(Black Hat)运算为”闭运算“的结果图与原图像之差。数学表达式为:
黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。
所以,黑帽运算用来分离比邻近点暗一些的斑块。
实例 - 核心代码:
实验结果:
六、综合实例
实验结果:
好了,今天OpenCV形态学学习到这里就结束了,喜欢的朋友可以给我点个赞!!!