1. 程式人生 > >opencv中的開運算,閉運算,形態學梯度,頂帽和黑帽簡介

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>