Canny運算元
Canny運算元
Canny於1986年開發出來的一個多級邊緣檢測演演算法。更為重要的是 Canny 創立了邊緣檢測計算理論。
CANNY運算元
Canny 的目標是找到一個最優的邊緣檢測演演算法,最優邊緣檢測的含義是:
好的檢測 - 演演算法能夠儘可能多地標識出圖像中的實際邊緣。
好的定位 - 標識出的邊緣要儘可能與實際圖像中的實際邊緣儘可能接近。
最小響應 - 圖像中的邊緣只能標識一次,並且可能存在的圖像雜訊不應標識為邊緣。
降噪 任何邊緣檢測演演算法都不可能在未經處理的原始數據上很好地工作,所以第一步是對原始數據與高斯 mask 作卷積,得到的圖像與原始圖像相比有些輕微的模糊(blurred)。這樣,單獨的一個像素雜訊在經過高斯平滑的圖像上變得幾乎沒有影響。
圖像中的邊緣可能會指向不同的方向,所以 Canny 演演算法使用 4 個 mask 檢測水平、垂直以及對角線方向的邊緣。原始圖像與每個 mask 所作的卷積都存儲起來。對於每個點我們都標識在這個點上的最大值以及生成的邊緣的方向。這樣我們就從原始圖像生成了圖像中每個點亮度梯度圖以及亮度梯度的方向。
較高的亮度梯度比較有可能是邊緣,但是沒有一個確切的值來限定多大的亮度梯度是邊緣多大又不是,所以 Canny 使用了滯后閾值。
滯后閾值需要兩個閾值——高閾值與低閾值。假設圖像中的重要邊緣都是連續的曲線,這樣我們就可以跟蹤給定曲線中模糊的部分,並且避免將沒有組成曲線 的雜訊像素當成邊緣。所以我們從一個較大的閾值開始,這將標識出我們比較確信的真實邊緣,使用前面導出的方向信息,我們從這些真正的邊緣開始在圖像中跟蹤 整個的邊緣。在跟蹤的時候,我們使用一個較小的閾值,這樣就可以跟蹤曲線的模糊部分直到我們回到起點。
一旦這個過程完成,我們就得到了一個二值圖像,每點表示是否是一個邊緣點。
一個獲得亞像素精度邊緣的改進實現是在梯度方向檢測二階方嚮導數的過零點
它在梯度方向的三階方嚮導數滿足符號條件
其中 Lx, Ly ... Lyyy 表示用高斯核平滑原始圖像得到的尺度空間表示 L 計算得到的偏導數。用這種方法得到的邊緣片斷是連續曲線,這樣就不需要另外的邊緣跟蹤改進。滯后閾值也可以用於亞像素邊緣檢測。
Canny 演演算法包含許多可以調整的參數,它們將影響到演演算法的計算的時間與實效。
高斯濾波器的大小:第一步所有的平滑濾波器將會直接影響 Canny 演演算法的結果。較小的濾波器產生的模糊效果也較少,這樣就可以檢測較小、變化明顯的細線。較大的濾波器產生的模糊效果也較多,將較大的一塊圖像區域塗成一個 特定點的顏色值。這樣帶來的結果就是對於檢測較大、平滑的邊緣更加有用,例如彩虹的邊緣。
閾值:使用兩個閾值比使用一個閾值更加靈活,但是它還是有閾值存在的共性問題。設置的閾值過高,可能會漏掉重要信息;閾值過低,將會把枝節信息看得很重要。很難給出一個適用於所有圖像的通用閾值。目前還沒有一個經過驗證的實現方法。
如果想要試驗 Canny 演演算法中的參數,http://matlabserver.cs.rug.nl 的在線 Canny 程序會很有幫助。
Canny 演演算法適用於不同的場合。它的參數允許根據不同實現的特定要求進行調整以識別不同的邊緣特性。對於PC上的實時圖像處理來說可能慢得無法使用,尤其是在使用大的高斯濾波器的情況下。但是,我們討論計算能力的時候,也要考慮到隨著處理器速度不斷提升,有望在未來幾年使得這不再成為一個問題。