opencv形态学滤波:开运算、闭运算、形态学梯度、顶帽、黑帽-morphologyEx函数

形态学的高级形态,往往都是建立在腐蚀和膨胀的过程这两个基本操作之上的。而关于腐蚀和膨胀操作得出来的效果出是怎么样的,请参考这篇文章:
opencv形态学滤波:腐蚀与膨胀

开运算:先腐蚀后膨胀的过程

开运算可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积
在这里插入图片描述

闭运算:先膨胀后腐蚀的过程

闭运算能够排除小型黑洞(黑色区域)
在这里插入图片描述

形态学梯度:膨胀图与腐蚀图之差

对二值图进行这一操作可以将团块的边缘突出出来,可以用形态学梯度来保留物体边缘轮廓
在这里插入图片描述

顶帽:原图像与上文刚刚介绍的“开运算”的结果图之差

顶帽运算往往用来分离比邻近点亮一些的斑块

因为开运算带来的结果是放大了裂缝或者局部低亮度区域。因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作与选择的核的大小相关。

在一幅图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用钉帽进行背景提取
在这里插入图片描述

黑帽:闭运算的结果图与原图像之差

黑帽运算用来分离比邻近点暗一些的斑块

黑帽运算后的效果图突出了比原图轮廓周围区域更暗的区域,且这一操作与选择的核的大小有关。
在这里插入图片描述

代码如下:

#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
    
    
    Mat src=imread("1.png");
    Mat dst;
    imshow("原图",src);

    Mat element=getStructuringElement(MORPH_RECT,Size(15,15));
    morphologyEx(src,dst,MORPH_BLACKHAT,element);

    imshow("效果图",dst);
    waitKey(0);

    return 0;
}

想要实现不同的运算,只需更改morphologyEx(src,dst,MORPH_BLACKHAT,element)中的MORPH_BLACKHAT参数,该参数的列举如下:

标识符 功能
MORPH_OPEN 开运算
MORPH_CLOSE 闭运算
MORPH_GRADIENT 形态学梯度
MORPH_TOPHAT “顶帽”
MORPH_BLACKHAT “黑帽”

对于getStructuringElement函数的解析,请查看此文章:
opencv形态学滤波:腐蚀与膨胀

猜你喜欢

转载自blog.csdn.net/seniorc/article/details/112254126