邊緣提取其實也是一種濾波,不同的算子有不同的提取效果。比較常用的方法有三種,Sobel算子,Laplacian算子,Canny算子。
Sobel算子檢測方法對灰度漸變和噪聲較多的圖像處理效果較好,sobel算子對邊緣定位不是很準確,圖像的邊緣不止一個像素;當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。
Canny方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣。優點在於,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,並且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出圖像中。
Laplacian算子法對噪聲比較敏感,所以很少用該算子檢測邊緣,而是用來判斷邊緣像素視為與圖像的明區還是暗區。拉普拉斯高斯算子是一種二階導數算子,將在邊緣處產生一個陡峭的零交叉, Laplacian算子是各向同性的,能對任何走向的界線和線條進行鋭化,無方向性。這是拉普拉斯算子區別於其他算法的最大優點。
使用一階微分算子提取邊緣流程:
1. 使用Prewitt或Sobel算子對圖像進行卷積;
2. 將梯度幅值大於閾值的點標記為邊緣;
3. (optional)將邊緣細化為一個像素寬度。
2、Canny邊緣檢測算法的處理流程
Canny邊緣檢測算法可以分為以下5個步驟:
1) 使用高斯濾波器,以平滑圖像,濾除噪聲。
2) 計算圖像中每個像素點的梯度強度和方向。
3) 應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散響應。
4) 應用雙閾值(Double-Threshold)檢測來確定真實的和潛在的邊緣。
5) 通過抑制孤立的弱邊緣最終完成邊緣檢測。
非極大值抑制
非極大值抑制是一種邊緣稀疏技術,非極大值抑制的作用在於“瘦”邊。對圖像進行梯度計算後,僅僅基於梯度值提取的邊緣仍然很模糊。對於標準3,對邊緣有且應當只有一個準確的響應。而非極大值抑制則可以幫助將局部最大值之外的所有梯度值抑制為0,對梯度圖像中每個像素進行非極大值抑制的算法是:
1) 將當前像素的梯度強度與沿正負梯度方向上的兩個像素進行比較。
2) 如果當前像素的梯度強度與另外兩個像素相比最大,則該像素點保留為邊緣點,否則該像素點將被抑制。
通常為了更加精確的計算,在跨越梯度方向的兩個相鄰像素之間使用線性插值來得到要比較的像素梯度,現舉例如下:
如圖3-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的梯度線性插值為:
雙閾值檢測
在施加非極大值抑制之後,剩餘的像素可以更準確地表示圖像中的實際邊緣。然而,仍然存在由於噪聲和顏色變化引起的一些邊緣像素。為了解決這些雜散響應,必須用弱梯度值過濾邊緣像素,並保留具有高梯度值的邊緣像素,可以通過選擇高低閾值來實現。如果邊緣像素的梯度值高於高閾值,則將其標記為強邊緣像素;如果邊緣像素的梯度值小於高閾值並且大於低閾值,則將其標記為弱邊緣像素;如果邊緣像素的梯度值小於低閾值,則會被抑制。閾值的選擇取決於給定輸入圖像的內容。
雙閾值檢測的偽代碼描寫如下:
抑制孤立低閾值點
到目前為止,被劃分為強邊緣的像素點已經被確定為邊緣,因為它們是從圖像中的真實邊緣中提取出來的。然而,對於弱邊緣像素,將會有一些爭論,因為這些像素可以從真實邊緣提取也可以是因噪聲或顏色變化引起的。為了獲得準確的結果,應該抑制由後者引起的弱邊緣。通常,由真實邊緣引起的弱邊緣像素將連接到強邊緣像素,而噪聲響應未連接。為了跟蹤邊緣連接,通過查看弱邊緣像素及其8個鄰域像素,只要其中一個為強邊緣像素,則該弱邊緣點就可以保留為真實的邊緣。
抑制孤立邊緣點的偽代碼描述如下:
3、Laplacian算子(二階微分算子)