Canny邊緣檢測演算法

2021-06-27 05:57:32 字數 2197 閱讀 5984

canny邊緣檢測演算法的步驟:

1 用高斯濾波器平滑濾波;

2 用一階偏導的有限差分來計算的梯度的幅值與方向;

3 對梯度幅值進行非極大值檢測(目的是細化邊緣);

4  通過雙閾值演算法對進行邊緣連線。

第一步:高斯濾波

高斯函式如下公式所示:

它的影象是這樣的:

高斯濾波,其實就是將與乙個高斯模組求卷積。根據高斯函式的特性,大於3×σ

的部分,可以不考

慮,所以一般而言,這個模板就是(6×

σ+1)行,(6×σ+1)列的乙個二維矩陣。如下圖所示:

注意,這一步的生成的資料可能沒有歸一化,最好歸一化。

接下來將得到的高斯矩陣與卷積就可以啦。其中σ越大,濾波後的的平滑性就越好,同時也越模糊。

下面舉個例子,這是原圖:

當σ=1時的濾波後的如下:

當σ=5時的為:

尺度越大,濾波效果也越好,但同時本身的高頻分量也會被濾掉。

第二步:通過求差分求解梯度的方向與幅值

差分運算元有很多,可以是sobel運算元,robert運算元,log運算元等,我用的是canny運算元,如下所示:

a=-1/2*[-1 1;-1 1];

b=-1/2*[1 1;-1 -1];

求解x與y方向的差分公式為:

f'x=1/2*( f(x+1,y)-f(x,y) + f(x+1,y+1)-f(x,y+1) );

f'y=1/2*( f(x,y+1)-f(x,y) + f(x+1,y+1)-f(x+1,y) );

求差分可以通過求卷積得到,如下公式:

pic_x=conv2(double(pic),a);

pic_y=conv2(double(pic),b);

然後再通過下面的公式求梯度的方向與幅值。

第三步:非極大值抑制

將0-360分成8個區間,分別是0-45,45-90,90-135,135-180及與他們相對的區間。

以0-45為例分析:

c到t1的方向是c點梯度的方向,非極大值抑制就是指,如果c點的值比它梯度方向的點的值要小,那麼這個點就會被抑制。而它的梯度方向不一會正好有畫素,所以要對之進行插值。經過非極值點抑制後的影象如下:

第四步:雙閾值演算法

這一步的原理是這樣的,要選擇兩個閾值,第乙個閾值比較大,梯度圖中,大於它的點都是真邊緣點。第二個閾值比較小,大於第二個閾值,但小於第乙個閾值的點是假邊緣點。如果乙個真邊緣點周圍的點有假邊緣點,那麼這個假邊緣點也會變成真邊緣點。經過雙閾值演算法,影象如下:

上圖是我的程式實現的,與matlab中給出的效果還有差距。下面的matlab中的canny函式濾波效果

邊緣檢測演算法 canny

在目前常用的邊緣檢測方法中,canny邊緣檢測演算法是具有嚴格定義的,可以提供良好可靠檢測的方法之一。由於它具有滿足邊緣檢測的三個標準和實現過程簡單的優勢,成為邊緣檢測最流行的演算法之一。canny邊緣檢測演算法可以分為以下5個步驟 1 使用高斯濾波器,以平滑影象,濾除雜訊。2 計算影象中每個畫素點...

canny邊緣檢測演算法 Tips

步驟 去雜訊任何邊緣檢測演算法都不可能在未經處理的原始資料上很好地處理,所以第一步是對原始資料與高斯平滑模板作卷積,得到的影象與原始影象相比有些輕微的模糊 blurred 這樣,單獨的乙個畫素雜訊在經過高斯平滑的影象上變得幾乎沒有影響。尋找影象中的亮度梯度 影象中的邊緣可能會指向不同的方向,所以 c...

opencv之canny邊緣檢測演算法

canny演算法由john f.canny於1986年開發,是很常用的邊緣檢測演算法。它是一種多階段演算法,內部過程共4個階段 雜訊抑制 通過gaussianblur高斯模糊降噪 使用5x5高斯濾波器去除影象中的雜訊 查詢邊緣的強度及方向 通過sobel濾波器 應用非最大訊號抑制 non maxim...