1.Canny邊緣檢測基本原理html
對於二維高斯分佈:算法
它的分佈圖以下:佈局
做爲高斯平滑濾波器的核就應該呈現出上圖的佈局,例如:測試
上圖分佈凸顯出了高斯該有的特色,所以,通常而言,高斯平滑濾波器要優於均值濾波器。優化
Input Imagespa
Output Image:3d
通過一個均值爲0,方差爲1的高斯核(5*5)進行處理獲得下圖:htm
通過一個均值爲0,方差爲2的高斯核(9*9)處理獲得下圖:blog
再通過一個均值爲0,方差爲4的高斯核(15*15)處理獲得下圖:ip
step3:對梯度幅值進行非極大值抑制(Non-maximum suppression, NMS)
圖像梯度幅值矩陣中的元素值越大,說明圖像中該點的梯度值越大,但這不不能說明該點就是邊緣(這僅僅是屬於圖像加強的過程)。在Canny算法中,非極大值抑制是進行邊緣檢測的重要步驟,通俗意義上是指尋找像素點局部最大值,將非極大值點所對應的灰度值置爲0,這樣能夠剔除掉一大部分非邊緣的點。
根據圖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