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