這周的主要工作還是進行剪紙風格的實現,因爲上週的邊緣檢測的效果還不是很好,對上週的方法又進行了改進。
Canny邊緣檢測算法的發展歷史
Canny邊緣檢測於1986年由JOHN CANNY首次在論文《A Computational Approach to Edge Detection》中提出,就此拉開了Canny邊緣檢測算法的序幕。
Canny邊緣檢測是從不同視覺對象中提取有用的結構信息並大大減少要處理的數據量的一種技術,目前已廣泛應用於各種計算機視覺系統。Canny發現,在不同視覺系統上對邊緣檢測的要求較爲類似,因此,可以實現一種具有廣泛應用意義的邊緣檢測技術。邊緣檢測的一般標準包括:
1) 以低的錯誤率檢測邊緣,也即意味着需要儘可能準確的捕獲圖像中儘可能多的邊緣。
2) 檢測到的邊緣應精確定位在真實邊緣的中心。
3) 圖像中給定的邊緣應只被標記一次,並且在可能的情況下,圖像的噪聲不應產生假的邊緣。
爲了滿足這些要求,Canny使用了變分法。Canny檢測器中的最優函數使用四個指數項的和來描述,它可以由高斯函數的一階導數來近似。
在目前常用的邊緣檢測方法中,Canny邊緣檢測算法是具有嚴格定義的,可以提供良好可靠檢測的方法之一。由於它具有滿足邊緣檢測的三個標準和實現過程簡單的優勢,成爲邊緣檢測最流行的算法之一。
Canny邊緣檢測算法的處理流程
Canny邊緣檢測算法可以分爲以下5個步驟:
1) 使用高斯濾波器,以平滑圖像,濾除噪聲。
2) 計算圖像中每個像素點的梯度強度和方向。
3) 應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散響應。
4) 應用雙閾值(Double-Threshold)檢測來確定真實的和潛在的邊緣。
5) 通過抑制孤立的弱邊緣最終完成邊緣檢測。
下面詳細介紹每一步的實現思路。
高斯平滑濾波
爲了儘可能減少噪聲對邊緣檢測結果的影響,所以必須濾除噪聲以防止由噪聲引起的錯誤檢測。爲了平滑圖像,使用高斯濾波器與圖像進行卷積,該步驟將平滑圖像,以減少邊緣檢測器上明顯的噪聲影響。大小爲(2k+1)x(2k+1)的高斯濾波器核的生成方程式由下式給出:
下面是一個sigma = 1.4,尺寸爲3x3的高斯卷積核的例子(需要注意歸一化):
若圖像中一個3x3的窗口爲A,要濾波的像素點爲e,則經過高斯濾波之後,像素點e的亮度值爲:
其中*爲卷積符號,sum表示矩陣中所有元素相加求和。
重要的是需要理解,高斯卷積核大小的選擇將影響Canny檢測器的性能。尺寸越大,檢測器對噪聲的敏感度越低,但是邊緣檢測的定位誤差也將略有增加。一般5x5是一個比較不錯的trade off。
計算梯度強度和方向
圖像中的邊緣可以指向各個方向,因此Canny算法使用四個算子來檢測圖像中的水平、垂直和對角邊緣。邊緣檢測的算子(如Roberts,Prewitt,Sobel等)返回水平Gx和垂直Gy方向的一階導數值,由此便可以確定像素點的梯度G和方向theta 。
其中G爲梯度強度, theta表示梯度方向,arctan爲反正切函數。下面以Sobel算子爲例講述如何計算梯度強度和方向。
x和y方向的Sobel算子分別爲:
其中Sx表示x方向的Sobel算子,用於檢測y方向的邊緣; Sy表示y方向的Sobel算子,用於檢測x方向的邊緣(邊緣方向和梯度方向垂直)。在直角座標系中,Sobel算子的方向如下圖所示。
圖3-1 Sobel算子的方向
若圖像中一個3x3的窗口爲A,要計算梯度的像素點爲e,則和Sobel算子進行卷積之後,像素點e在x和y方向的梯度值分別爲:
其中*爲卷積符號,sum表示矩陣中所有元素相加求和。根據公式(3-2)便可以計算出像素點e的梯度和方向。
非極大值抑制
非極大值抑制是一種邊緣稀疏技術,非極大值抑制的作用在於“瘦”邊。對圖像進行梯度計算後,僅僅基於梯度值提取的邊緣仍然很模糊。對於標準3,對邊緣有且應當只有一個準確的響應。而非極大值抑制則可以幫助將局部最大值之外的所有梯度值抑制爲0,對梯度圖像中每個像素進行非極大值抑制的算法是:
1) 將當前像素的梯度強度與沿正負梯度方向上的兩個像素進行比較。
2) 如果當前像素的梯度強度與另外兩個像素相比最大,則該像素點保留爲邊緣點,否則該像素點將被抑制。
通常爲了更加精確的計算,在跨越梯度方向的兩個相鄰像素之間使用線性插值來得到要比較的像素梯度,現舉例如下:
圖3-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個鄰域像素,只要其中一個爲強邊緣像素,則該弱邊緣點就可以保留爲真實的邊緣。
抑制孤立邊緣點的僞代碼描述如下:
參考資料:https://www.cnblogs.com/techyan1990/p/7291771.html