1. 程式人生 > >Canny邊緣檢測運算元原理

Canny邊緣檢測運算元原理

canny運算元是影象處理中比較常用的演算法,之前曾用canny來進行邊緣檢測,方便接下來的用Hough對影象進行處理,其中Canny運算元的演算法原理中有好多基本的概率都很重要,為了溫故所以寫篇Canny,有不做和錯誤的地方歡迎指徵。

首先介紹一下Canny對邊緣檢測質量進行分析提出了三個原則:1.信噪比準則、2.定位精度準則、3.但邊緣響應準則,具體什麼意思這裡就不貼了。邊緣檢測演算法難點在於需要在排除噪聲和精準定位方面,正所謂魚和熊掌不可兼得。Canny運算元可以在這兩者之間比較好的折衷

演算法步驟

(1)用高斯濾波器平滑影象

這裡為什麼用對影象進行平滑,有一種解釋是在後期邊緣檢測的時候可以獲得比較圓潤的邊緣,坑擊噪聲對影象的干擾

1)是高斯函式,但是在canny運算元中用的是不帶係數的高斯函式,G(x,y)=F(x,y)*H(x,y),G為濾波後的影象,F為原始影象

(2)用一階偏導的有限差分計算梯度幅值和方向

(2)數學表示式

(3)計算模板

(4)計算梯度幅值和方向

附:在canny運算元中使用的是一階偏導如(2),二階偏導的數學表示式:f(x+1)-f(x)-(f(x)-f(x-1))=f(x+1)+f(x1)-2f(x)

(3)對梯度幅值進行非極大值抑制

在http://blog.csdn.net/xiaxiazls/article/details/47841435這篇文章中的這部分介紹很詳細。要進行非極大值抑制,就首先要確定畫素點C的灰度值在其8值鄰域內是否為最大。圖1中藍色的線條方向為C點的梯度方向,這樣就可以確定其區域性的最大值肯定分佈在這條線上,也即出了C點外,梯度方向的交點dTmp1和dTmp2這兩個點的值也可能會是區域性最大值。因此,判斷C點灰度與這兩個點灰度大小即可判斷C點是否為其鄰域內的區域性最大灰度點。如果經過判斷,C點灰度值小於這兩個點中的任一個,那就說明C點不是區域性極大值,那麼則可以排除C點為邊緣。這就是非極大值抑制的工作原理。


(4)用雙閾值方法檢測和連線邊緣

使用兩個閾值T1和T2(T1<T2),首先使用高閾值得到一個邊緣影象,但是該邊緣影象由於採用的是高閾值,所以存在不連續的情況比較多,這個時候在高閾值邊緣影象的端點8領域處尋找可以連線的到輪廓上的邊緣,當滿足閾值T1時連線。