1.Canny邊緣檢測基本原理
對於二維高斯分布:
它的分布圖如下:
作為高斯平滑濾波器的核就應該呈現出上圖的布局,例如:
上圖分布凸顯出了高斯該有的特點,因此,一般而言,高斯平滑濾波器要優於均值濾波器。
Input Image
Output Image:
經過一個均值為0,方差為1的高斯核(5*5)進行處理得到下圖:
經過一個均值為0,方差為2的高斯核(9*9)處理得到下圖:
再經過一個均值為0,方差為4的高斯核(15*15)處理得到下圖:
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