Canny邊緣檢測


1.Canny邊緣檢測基本原理

     (1)圖象邊緣檢測必須滿足兩個條件:一能有效地抑制噪聲;二必須盡量精確確定邊緣的位置。
     (2)根據對信噪比與定位乘積進行測度,得到最優化逼近算子。這就是Canny邊緣檢測算子。
     (3)類似與Marr(LoG)邊緣檢測方法,也屬於先平滑后求導數的方法。
2.Canny邊緣檢測算法
     step1:用高斯濾波器平滑圖象;
     step2:用一階偏導的有限差分來計算梯度的幅值和方向;
     step3:對梯度幅值進行非極大值抑制;
     step4:用雙閾值算法檢測和連接邊緣。
下面分步來進行講解:
 
    step1:高斯平滑濾波器(Gaussian Smoothing Filter)
 
    高斯平滑濾波器被使用去模糊圖像,和均值濾波器差不多,但是和均值濾波器不一樣的地方就是核不同。均值濾波器的核每一個值都是相等,而高斯平滑濾波器的核內的數卻是呈現高斯分布的。

對於二維高斯分布:

 

它的分布圖如下:

        

作為高斯平滑濾波器的核就應該呈現出上圖的布局,例如:

        

 

上圖分布凸顯出了高斯該有的特點,因此,一般而言,高斯平滑濾波器要優於均值濾波器。

 

Input Image

        

Output Image:

經過一個均值為0,方差為1的高斯核(5*5)進行處理得到下圖:

        

經過一個均值為0,方差為2的高斯核(9*9)處理得到下圖:

         

再經過一個均值為0,方差為4的高斯核(15*15)處理得到下圖:

        

    step2:用一階偏導的有限差分來計算梯度的幅值和方向

 

  

    step3:對梯度幅值進行非極大值抑制(Non-maximum suppression, NMS)

        圖像梯度幅值矩陣中的元素值越大,說明圖像中該點的梯度值越大,但這不不能說明該點就是邊緣(這僅僅是屬於圖像增強的過程)。在Canny算法中,非極大值抑制是進行邊緣檢測的重要步驟,通俗意義上是指尋找像素點局部最大值,將非極大值點所對應的灰度值置為0,這樣可以剔除掉一大部分非邊緣的點。

圖1 非極大值抑制原理

        根據圖1 可知,要進行非極大值抑制,就首先要確定像素點C的灰度值在其8值鄰域內是否為最大。圖1中藍色的線條方向為C點的梯度方向,這樣就可以確定其局部的最大值肯定分布在這條線上,也即出了C點外,梯度方向的交點dTmp1和dTmp2這兩個點的值也可能會是局部最大值。因此,判斷C點灰度與這兩個點灰度大小即可判斷C點是否為其鄰域內的局部最大灰度點。如果經過判斷,C點灰度值小於這兩個點中的任一個,那就說明C點不是局部極大值,那么則可以排除C點為邊緣。這就是非極大值抑制的工作原理。

        作者認為,在理解的過程中需要注意以下兩點:

        1)中非最大抑制是回答這樣一個問題:“當前的梯度值在梯度方向上是一個局部最大值嗎?” 所以,要把當前位置的梯度值與梯度方向上兩側的梯度值進行比較;

        2)梯度方向垂直於邊緣方向。

        但實際上,我們只能得到C點鄰域的8個點的值,而dTmp1和dTmp2並不在其中,要得到這兩個值就需要對該兩個點兩端的已知灰度進行線性插值,也即根據圖1中的g1和g2對dTmp1進行插值,根據g3和g4對dTmp2進行插值,這要用到其梯度方向,這是上文Canny算法中要求解梯度方向矩陣Thita的原因。

        完成非極大值抑制后,會得到一個二值圖像,非邊緣的點灰度值均為0,可能為邊緣的局部灰度極大值點可設置其灰度為128。根據下文的具體測試圖像可以看出,這樣一個檢測結果還是包含了很多由噪聲及其他原因造成的假邊緣。因此還需要進一步的處理。

 

    step4:用雙閾值算法檢測和連接邊緣

    

        對非極大值抑制圖像作用兩個閾值th1和th2,兩者關系th1=0.4th2。我們把梯度值小於th1的像素的灰度值設為0,得到圖像1。然后把梯度值小於th2的像素的灰度值設為0,得到圖像2。由於圖像2的閾值較高,去除大部分噪音,但同時也損失了有用的邊緣信息。而圖像1的閾值較低,保留了較多的信息,我們可以以圖像2為基礎,以圖像1為補充來連結圖像的邊緣。

  鏈接邊緣的具體步驟如下:

  對圖像2進行掃描,當遇到一個非零灰度的像素p(x,y)時,跟蹤以p(x,y)為開始點的輪廓線,直到輪廓線的終點q(x,y)。

  考察圖像1中與圖像2中q(x,y)點位置對應的點s(x,y)的8鄰近區域。如果在s(x,y)點的8鄰近區域中有非零像素s(x,y)存在,則將其包括到圖像2中,作為r(x,y)點。從r(x,y)開始,重復第一步,直到我們在圖像1和圖像2中都無法繼續為止。

  當完成對包含p(x,y)的輪廓線的連結之后,將這條輪廓線標記為已經訪問。回到第一步,尋找下一條輪廓線。重復第一步、第二步、第三步,直到圖像2中找不到新輪廓線為止。

  至此,完成canny算子的邊緣檢測。

 

   參考文獻:http://www.cnblogs.com/cfantaisie/archive/2011/06/05/2073168.html

        http://www.xuebuyuan.com/1541968.html

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM