Canny邊緣檢測

1.Canny邊緣檢測基本原理html

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

對於二維高斯分佈:算法

 

它的分佈圖以下:佈局

        

做爲高斯平滑濾波器的核就應該呈現出上圖的佈局,例如:測試

        

 

上圖分佈凸顯出了高斯該有的特色,所以,通常而言,高斯平滑濾波器要優於均值濾波器。優化

 

Input Imagespa

        

Output Image:3d

通過一個均值爲0,方差爲1的高斯核(5*5)進行處理獲得下圖:htm

        

通過一個均值爲0,方差爲2的高斯核(9*9)處理獲得下圖:blog

         

再通過一個均值爲0,方差爲4的高斯核(15*15)處理獲得下圖:ip

        

    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

相關文章
相關標籤/搜索