1. 程式人生 > >邊緣檢測---Canny運算元

邊緣檢測---Canny運算元

http://www.cnblogs.com/techyan1990/p/7291771.html

1.Canny邊緣檢測演算法可以分為以下5個步驟

1)        使用高斯濾波器,以平滑影象,濾除噪聲。

2)        計算影象中每個畫素點的梯度大小和方向

3)        應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散響應。

4)        應用雙閾值(Double-Threshold)檢測來確定真實的和潛在的邊緣。

5)        通過抑制孤立的弱邊緣最終完成邊緣檢測。

詳細介紹:

2.1 高斯平滑濾波

為了儘可能減少噪聲對邊緣檢測結果的影響,所以必須濾除噪聲以防止由噪聲引起的錯誤檢測。為了平滑影象,使用高斯濾波器與影象進行卷積,該步驟將平滑影象,以減少邊緣檢測器上明顯的噪聲影響。大小為(2k+1)x(2k+1)的高斯濾波器核的生成方程式由下式給出:

   

下面是一個sigma = 1.4,尺寸為3x3的高斯卷積核的例子(需要注意歸一化):

若影象中一個3x3的視窗為A,要濾波的畫素點為e,則經過高斯濾波之後,畫素點e的亮度值為:

 其中*為卷積符號,sum表示矩陣中所有元素相加求和。

重要的是需要理解,高斯卷積核大小的選擇將影響Canny檢測器的效能。尺寸越大,檢測器對噪聲的敏感度越低,但是邊緣檢測的定位誤差也將略有增加。一般5x5是一個比較不錯的trade off。

2.2 計算梯度強度和方向

影象中的邊緣可以指向各個方向,因此Canny演算法使用四個運算元來檢測影象中的水平、垂直和對角邊緣。邊緣檢測的運算元(如Roberts,Prewitt,Sobel等)返回水平Gx和垂直Gy方向的一階導數值,由此便可以確定畫素點的梯度G和方向theta 。

其中G為梯度強度, theta表示梯度方向,arctan為反正切函式。下面以Sobel運算元為例講述如何計算梯度強度和方向。

x和y方向的Sobel運算元分別為:

其中Sx表示x方向的Sobel運算元,用於檢測y方向的邊緣; Sy表示y方向的Sobel運算元,用於檢測x方向的邊緣(邊緣方向和梯度方向垂直)。在直角座標系中,Sobel運算元的方向如下圖所示。

圖2-1 Sobel運算元的方向

 若影象中一個3x3的視窗為A,要計算梯度的畫素點為e,則和Sobel運算元進行卷積之後,畫素點e在x和y方向的梯度值分別為: 

 

其中*為卷積符號,sum表示矩陣中所有元素相加求和。根據公式(3-2)便可以計算出畫素點e的梯度和方向。

2.3 非極大值抑制

非極大值抑制是一種邊緣稀疏技術,非極大值抑制的作用在於“瘦”邊。對影象進行梯度計算後,僅僅基於梯度值提取的邊緣仍然很模糊。對於標準3,對邊緣有且應當只有一個準確的響應。而非極大值抑制則可以幫助將區域性最大值之外的所有梯度值抑制為0,對梯度影象中每個畫素進行非極大值抑制的演算法是:

1)        將當前畫素的梯度強度與沿正負梯度方向上的兩個畫素進行比較。

2)        如果當前畫素的梯度強度與另外兩個畫素相比最大,則該畫素點保留為邊緣點,否則該畫素點將被抑制。

通常為了更加精確的計算,在跨越梯度方向的兩個相鄰畫素之間使用線性插值來得到要比較的畫素梯度,現舉例如下:

          圖2-2 梯度方向分割

如圖2-2所示,將梯度分為8個方向,分別為E、NE、N、NW、W、SW、S、SE,其中0代表00~45o,1代表450~90o,2代表-900~-45o,3代表-450~0o。畫素點P的梯度方向為theta,則畫素點P1和P2的梯度線性插值為: 

因此非極大值抑制的虛擬碼描寫如下:

 

需要注意的是,如何標誌方向並不重要,重要的是梯度方向的計算要和梯度運算元的選取保持一致。

2.4 雙閾值檢測

在施加非極大值抑制之後,剩餘的畫素可以更準確地表示影象中的實際邊緣。然而,仍然存在由於噪聲和顏色變化引起的一些邊緣畫素。為了解決這些雜散響應,必須用弱梯度值過濾邊緣畫素,並保留具有高梯度值的邊緣畫素,可以通過選擇高低閾值來實現。如果邊緣畫素的梯度值高於高閾值,則將其標記為強邊緣畫素;如果邊緣畫素的梯度值小於高閾值並且大於低閾值,則將其標記為弱邊緣畫素;如果邊緣畫素的梯度值小於低閾值,則會被抑制。閾值的選擇取決於給定輸入影象的內容。

雙閾值檢測的虛擬碼描寫如下:

2.5 抑制孤立低閾值點

到目前為止,被劃分為強邊緣的畫素點已經被確定為邊緣,因為它們是從影象中的真實邊緣中提取出來的。然而,對於弱邊緣畫素,將會有一些爭論,因為這些畫素可以從真實邊緣提取也可以是因噪聲或顏色變化引起的。為了獲得準確的結果,應該抑制由後者引起的弱邊緣。通常,由真實邊緣引起的弱邊緣畫素將連線到強邊緣畫素,而噪聲響應未連線。為了跟蹤邊緣連線,通過檢視弱邊緣畫素及其8個鄰域畫素,只要其中一個為強邊緣畫素,則該弱邊緣點就可以保留為真實的邊緣。

抑制孤立邊緣點的虛擬碼描述如下: