1. 程式人生 > >Candy演算法--理解

Candy演算法--理解

Canny邊緣檢測運算元的目標是找到一個最優的邊緣檢測演算法,最優邊緣檢測的含義是:

  1. 好的檢測 - 演算法能夠儘可能多地標識出影象中的實際邊緣。
  2. 好的定位 - 標識出的邊緣要與實際影象中的實際邊緣儘可能接近(邊緣過粗,難以精確定位)。
  3. 最小響應 - 影象中的邊緣只能標識一次,並且可能存在的影象噪聲不應標識為邊緣(檢測所有邊緣)。

為了滿足這些要求Canny使用了變分法,這是一種尋找滿足特定功能的函式的方法。最優檢測使用四個指數函式項的和表示,但是它非常近似於高斯函式的一階導數

Canny演算法步驟

  • 降噪

任何邊緣檢測演算法都不可能在未經處理的原始資料上很好地處理,所以第一步是對原始資料與高斯平滑模板作

卷積,得到的影象與原始影象相比有些輕微的模糊(blurred)。這樣,單獨的一個畫素噪聲在經過高斯平滑的影象上變得幾乎沒有影響。

  • 尋找影象中的亮度梯度

影象中的邊緣可能會指向不同的方向,所以Canny演算法使用4個mask檢測水平、垂直以及對角線方向的邊緣。原始影象與每個mask所作的卷積都儲存起來。對於每個點我們都標識在這個點上的最大值以及生成的邊緣的方向。這樣我們就從原始影象生成了影象中每個點亮度梯度圖以及亮度梯度的方向。

  • 在影象中跟蹤邊緣

較高的亮度梯度比較有可能是邊緣,但是沒有一個確切的值來限定多大的亮度梯度是邊緣多大又不是,所以Canny使用了

滯後閾值。

滯後閾值需要兩個閾值——高閾值低閾值。假設影象中的重要邊緣都是連續的曲線,這樣我們就可以跟蹤給定曲線中模糊的部分,並且避免將沒有組成曲線的噪聲畫素當成邊緣。所以我們從一個較大的閾值開始,這將標識出我們比較確信的真實邊緣,使用前面匯出的方向資訊,我們從這些真正的邊緣開始在影象中跟蹤整個的邊緣。在跟蹤的時候,我們使用一個較小的閾值,這樣就可以跟蹤曲線的模糊部分直到我們回到起點。

一旦這個過程完成,我們就得到了一個二值影象,每點表示是否是一個邊緣點。

引數

  • 高斯濾波器的大小:第一步所用的平滑濾波器將會直接影響Canny演算法的結果。較小的濾波器產生的模糊效果也較少,這樣就可以檢測較小、變化明顯的細線。較大的濾波器產生的模糊效果也較多,將較大的一塊影象區域塗成一個特定點的顏色值。這樣帶來的結果就是對於檢測較大、平滑的邊緣更加有用,例如彩虹的邊緣。
  • 閾值:使用兩個閾值比使用一個閾值更加靈活,但是它還是有閾值存在的共性問題。設定的閾值過高,可能會漏掉重要資訊;閾值過低,將會把枝節資訊看得很重要。很難給出一個適用於所有影象的通用閾值。目前還沒有一個經過驗證的實現方法。

如果想要試驗Canny演算法中的引數,http://matlabserver.cs.rug.nl 的線上Canny程式會很有幫助。