Opencv中提供了图像形态学运算的接口,像基本的腐蚀膨胀都有自己单独的函数接口,但实际上调用morphologyEx()一个函数接口使用不同的参数就可以完成所有常见的形态学运算,包括腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度。
示例:
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(src, dst, MORPH_DILATE, element);
element是运算核(内核矩阵),从getStructuringElement()函数返回获取一个矩阵,getStructuringElement()函数定义了运算核的类型,MORPH_RECT代表的是矩形的运算核,还可以选择MORPH_ELLIPSE椭圆核和MORPH_CROSS十字形核;第二个参数是设置运算核的大小cv::Size()。
morphologyEx()函数第一个参数为原图像(待运算的图像),第二个参数为目标图像(运算生成的图像),第三个参数最为重要,为运算类型,关于不同标识符作为参数输入与对应的运算类型有一个表非常详细:
标识符 | 运算类型 |
MORPH_ERODE | 腐蚀 |
MORPH_DILATE | 膨胀 |
MORPH_OPEN | 开运算 |
MORPH_CLOSE | 闭运算 |
MORPH_GRADIENT | 形态学梯度 |
MORPH_TOPHAT | 顶帽运算 |
MORPH_BLACKHAT | 黑帽运算 |
最后一个参数就是已经设置好的内核矩阵element。
- 腐蚀与膨胀
腐蚀与膨胀是形态学中最基本的运算,其实所谓的”腐蚀“与”膨胀“都是针对亮度较高的像素而言的,腐蚀运算会将高亮像素区域局部缩小,而膨胀运算会将高亮像素区域局部放大。
![](https://i-blog.csdnimg.cn/blog_migrate/93a2303561d470097caffb7a17598c65.png)
![](https://i-blog.csdnimg.cn/blog_migrate/732fad177555a3fe9c5514a113d7dfbe.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2fa15e013a0f9608f29cad6922901cef.png)
- 开运算与闭运算
开运算与闭运算都是在腐蚀膨胀的基础上进行的;准确地说,开运算就是先进行腐蚀再进行膨胀,可以消除图像中较小的亮点(在前景检测中开运算能够很好的消除二值前景图像中的噪声点);闭运算就是先进行膨胀再进行腐蚀,可以消除图像中小型的黑洞。
![](https://i-blog.csdnimg.cn/blog_migrate/93a2303561d470097caffb7a17598c65.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2f45e28e8f969cf06aec9caf2f7fcf2a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6e4089b90d6d3a25be5bbfbd50cbbb5d.png)
- 形态学梯度
形态学梯度与开闭运算一样,是在腐蚀膨胀的基础上进行的运算;不同的是形态学梯度图是膨胀图与腐蚀图做差分得到的图像,通过膨胀图减去腐蚀图可以得到图像的边缘轮廓区域的像素。
![](https://i-blog.csdnimg.cn/blog_migrate/93a2303561d470097caffb7a17598c65.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b590081bf0827a9c855fc1fd28395bf0.png)
- 顶帽与黑帽
顶帽:原图像与开运算图之差,用于分离局部较亮区域的像素。
黑帽:闭运算与原图像之差,用于分离局部较暗区域的像素。
![](https://i-blog.csdnimg.cn/blog_migrate/93a2303561d470097caffb7a17598c65.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a857c387beb7dc28872113e15fb60b4c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ed42514fd04b8a8bcbae6afc84b8cb29.png)