opencv中的开运算,闭运算,形态学梯度,顶帽和黑帽简介

  • 1.开运算
    开运算 = 先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了)
    开运算的效果图如下图所示:
    这里写图片描述
  • 开运算总结:
    (1)开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不便。
    (2)开运算是一个基于几何运算的滤波器。
    (3)结构元素大小的不同将导致滤波效果的不同。
    (4)不同的结构元素的选择导致了不同的分割,即提取出不同的特征。

    • 2.闭运算
      闭运算 = 先膨胀运算,再腐蚀运算(看上去将两个细微连接的图块封闭在一起)
      闭运算的效果图如下图所示:

    这里写图片描述
    - 闭运算总结:
    (1)闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
    (2)闭运算是通过填充图像的凹角来滤波图像的。
    (3)结构元素大小的不同将导致滤波效果的不同。
    (4)不同结构元素的选择导致了不同的分割。


    我们可以使用opencv自带函数进行调试哦!
    openCV里有一个很好的函数getStructuringElement,我们只要往这个函数传相应的处理参数,就可以进行相应的操作了,使用起来非常方便。下面我简单列举一下相应的操作宏定义:

    标识符 含义
    MORPH_OPEN 开运算
    MORPH_CLOSE 闭运算
    MORPH_ERODE 腐蚀
    MORPH_DILATE 膨胀

    我就简单举个例子:

    #include<opencv2\opencv.hpp>   
    #include<opencv2\highgui\highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
        Mat img = imread("寒山不冷.jpg");
        namedWindow("原始图", WINDOW_NORMAL);
        imshow("原始图", img);
        Mat out;
        //获取自定义核 第一个参数MORPH_RECT表示矩形的卷积核,当然还可以选择椭圆形的、交叉型的
        Mat element = getStructuringElement(MORPH_RECT, Size(18, 18)); 
    
    
        //具体要选择哪种操作,就修改第三个参数就可以了。这里演示的是形态学开运算处理
        morphologyEx(img, out, MORPH_OPEN, element);
        namedWindow("形态学处理操作", WINDOW_NORMAL);
        imshow("形态学处理操作", out);
        waitKey(0);
    
    }

    开运算:先腐蚀,再膨胀

    可以清除一些小东西(亮的),放大局部低亮度的区域


    闭运算:先膨胀,再腐蚀

    可以清除小黑点


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

    提取物体边缘


    顶帽:原图像 - 开运算图

    突出原图像中比周围亮的区域


    黑帽:闭运算图 - 原图像

    突出原图像中比周围暗的区域


    这些运算都能用一个函数进行处理

    void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, ...)


    看前四个参数就行了,后面的就用默认值

    第一个参数 输入

    第二个参数 输出

    第三个参数 操作类型

    MORTH_OPEN 函数做开运算

    MORTH_CLOSE 函数做闭运算

    MORTH_GRADIENT 函数做形态学梯度运算

    MORTH_TOPHAT 函数做顶帽运算

    MORTH_BLACKHAT 函数做黑帽运算

    MORTH_DILATE 函数做膨胀运算

    MORTH_ERODE 函数做腐蚀运算


    第四个参数 内核类型 用getStructuringElement函数得到


    例子:

    	morphologyEx(ma1, maArray[0], MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(15,15)));
    	imshow("im4", maArray[0]);
    
    morphologyEx(ma1, maArray[1], MORPH_CLOSE, getStructuringElement(MORPH_RECT, Size(15, 15)));
    imshow("im5", maArray[1]);
    
    morphologyEx(ma1, maArray[2], MORPH_GRADIENT, getStructuringElement(MORPH_RECT, Size(15, 15)));
    imshow("im6", maArray[2]);
    
    morphologyEx(ma1, maArray[3], MORPH_TOPHAT, getStructuringElement(MORPH_RECT, Size(15, 15)));
    imshow("im7", maArray[3]);
    
    morphologyEx(ma1, maArray[4], MORPH_BLACKHAT, getStructuringElement(MORPH_RECT, Size(15, 15)));
    imshow("im8", maArray[4]);
    
    morphologyEx(ma1, maArray[5], MORPH_DILATE, getStructuringElement(MORPH_RECT, Size(15, 15)));
    imshow("im9", maArray[5]);
    
    morphologyEx(ma1, maArray[6], MORPH_ERODE, getStructuringElement(MORPH_RECT, Size(15, 15)));
    imshow("im10", maArray[6]);</code></pre>
    


    猜你喜欢

    转载自blog.csdn.net/zqx951102/article/details/83004037