邊緣檢測演算法 canny

2021-10-07 18:27:29 字數 3449 閱讀 8265

在目前常用的邊緣檢測方法中,canny邊緣檢測演算法是具有嚴格定義的,可以提供良好可靠檢測的方法之一。由於它具有滿足邊緣檢測的三個標準和實現過程簡單的優勢,成為邊緣檢測最流行的演算法之一。

canny邊緣檢測演算法可以分為以下5個步驟:

1)使用高斯濾波器,以平滑影象,濾除雜訊。

2) 計算影象中每個畫素點的梯度強度和方向。

3)應用非極大值(non-maximum suppression)抑制,以消除邊緣檢測帶來的雜散響應。

4)應用雙閾值(double-threshold)檢測來確定真實的和潛在的邊緣。

5) 通過抑制孤立的弱邊緣最終完成邊緣檢測

步驟:

(1)高斯濾波(去燥)

目的:為了盡可能減少雜訊對邊緣檢測結果的影響,所以必須濾除雜訊以防止由雜訊引起的錯誤檢測。

尺寸為3x3的高斯卷積核的例子(需要注意歸一化):

若影象中乙個3x3的視窗為a,要濾波的畫素點為e,則經過高斯濾波之後,畫素點e的亮度值為:

其中*為卷積符號,sum表示矩陣中所有元素相加求和。

高斯卷積核大小的選擇將影響canny檢測器的效能。尺寸越大,檢測器對雜訊的敏感度越低,但是邊緣檢測的定位誤差也將略有增加。一般5x5是乙個比較不錯的trade off。

(2)計算梯度強度和方向

影象中的邊緣可以指向各個方向,因此canny演算法使用四個運算元來檢測影象中的水平、垂直和對角邊緣。邊緣檢測的運算元(如roberts,prewitt,sobel等)返回水平gx和垂直gy方向的一階導數值,由此便可以確定畫素點的梯度g和方向theta

其中g為梯度強度, theta表示梯度方向,arctan為反正切函式

若影象中乙個3x3的視窗為a,要計算梯度的畫素點為e,則和sobel運算元進行卷積之後,畫素點e在x和y方向的梯度值分別為:

其中*為卷積符號,sum表示矩陣中所有元素相加求和。

根據公式

便可以計算出畫素點e的梯度和方向。

(3)非極大值抑制

非極大值抑制是一種邊緣稀疏技術,非極大值抑制的作用在於「瘦」邊。對影象進行梯度計算後,僅僅基於梯度值提取的邊緣仍然很模糊。對於標準3,對邊緣有且應當只有乙個準確的響應。而非極大值抑制則可以幫助將區域性最大值之外的所有梯度值抑制為0,對梯度影象中每個畫素進行非極大值抑制的演算法是:

1)將當前畫素的梯度強度與沿正負梯度方向上的兩個畫素進行比較。

2)如果當前畫素的梯度強度與另外兩個畫素相比最大,則該畫素點保留為邊緣點,否則該畫素點將被抑制。

如圖3-2所示,將梯度分為8個方向,分別為e、ne、n、nw、w、sw、s、se,其中0代表0045o,1代表45090o,2代表-900-45o,3代表-4500o。

畫素點p的梯度方向為theta,則畫素點p1和p2的梯度線性插值為:

(4)雙閾值檢測(設定閾值,規定成為邊緣,梯度需要達到的界限)在施加非極大值抑制之後,剩餘的畫素可以更準確地表示影象中的實際邊緣。然而,仍然存在由於雜訊和顏色變化引起的一些邊緣畫素為了解決這些雜散響應必須用弱梯度值過濾邊緣畫素,並保留具有高梯度值的邊緣畫素,可以通過選擇高低閾值來實現。如果邊緣畫素的梯度值高於高閾值,則將其標記為強邊緣畫素;如果邊緣畫素的梯度值小於高閾值並且大於低閾值,則將其標記為弱邊緣畫素;如果邊緣畫素的梯度值小於低閾值,則會被抑制。閾值的選擇取決於給定輸入影象的內容。

(5)抑制孤立低閾值點

到目前為止,被劃分為強邊緣的畫素點已經被確定為邊緣,因為它們是從影象中的真實邊緣中提取出來的。然而,對於弱邊緣畫素,將會有一些爭論,因為這些畫素可以從真實邊緣提取也可以是因雜訊或顏色變化引起的。為了獲得準確的結果,應該抑制由後者引起的弱邊緣。通常,由真實邊緣引起的弱邊緣畫素將連線到強邊緣畫素,而雜訊響應未連線。為了跟蹤邊緣連線,通過檢視弱邊緣畫素及其8個鄰域畫素只要其中乙個為強邊緣畫素,則該弱邊緣點就可以保留為真實的邊緣。

#設定雙閾值

canny1=cv2.canny(img,50,

110)

canny2=cv2.canny(img,

100,

180)

res=np.hstack(

(canny1,canny2)

)img_show(res)

原圖

canny檢測

Canny邊緣檢測演算法

canny邊緣檢測演算法的步驟 1 用高斯濾波器平滑濾波 2 用一階偏導的有限差分來計算的梯度的幅值與方向 3 對梯度幅值進行非極大值檢測 目的是細化邊緣 4 通過雙閾值演算法對進行邊緣連線。第一步 高斯濾波 高斯函式如下公式所示 它的影象是這樣的 高斯濾波,其實就是將與乙個高斯模組求卷積。根據高斯...

canny邊緣檢測演算法 Tips

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

opencv之canny邊緣檢測演算法

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