Canny邊緣檢測

2021-08-20 10:35:27 字數 2271 閱讀 5877

canny邊緣檢測是一種非常流行的邊緣檢測演算法,是john canny在2023年提出的。它是乙個多階段的演算法,即由多個步驟構成。

1.影象降噪

2.計算影象梯度

3.非極大值抑制

4.閾值篩選

我們就事後諸葛亮,分析下這個步驟的緣由。

首先,影象降噪。我們知道梯度運算元可以用於增強影象,本質上是通過增強邊緣輪廓來實現的,也就是說是可以檢測到邊緣的。但是,它們受雜訊的影響都很大。那麼,我們第一步就是想到要先去除雜訊,因為雜訊就是灰度變化很大的地方,所以容易被識別為偽邊緣。

第二步,計算影象梯度,得到可能邊緣。我們在前面的關於《影象梯度》文章中有所介紹,計算影象梯度能夠得到影象的邊緣,因為梯度是灰度變化明顯的地方,而邊緣也是灰度變化明顯的地方。當然這一步只能得到可能的邊緣。因為灰度變化的地方可能是邊緣,也可能不是邊緣。這一步就有了所有可能是邊緣的集合。

第三步,非極大值抑制。通常灰度變化的地方都比較集中,將區域性範圍內的梯度方向上,灰度變化最大的保留下來,其它的不保留,這樣可以剔除掉一大部分的點。將有多個畫素寬的邊緣變成乙個單畫素寬的邊緣。即「胖邊緣」變成「瘦邊緣」。

第四步,雙閾值篩選。通過非極大值抑制後,仍然有很多的可能邊緣點,進一步的設定乙個雙閾值,即低閾值(low),高閾值(high)。灰度變化大於high的,設定為強邊緣畫素,低於low的,剔除。在low和high之間的設定為弱邊緣。進一步判斷,如果其領域內有強邊緣畫素,保留,如果沒有,剔除。

這樣做的目的是只保留強邊緣輪廓的話,有些邊緣可能不閉合,需要從滿足low和high之間的點進行補充,使得邊緣盡可能的閉合。

我們看看效果:

# 讀入影象

lenna = cv2.imread("images\\lenna.png", 0)

# 影象降噪

lenna = cv2.gaussianblur(lenna, (5, 5), 0)

# canny邊緣檢測,50為低閾值low,150為高閾值high

canny = cv2.canny(lenna, 50, 150)

cv2.imshow("canny", canny)

cv2.waitkey()

在opencv中,canny函式本身應該沒有將影象降噪包含在內。因此,實施canny邊緣檢測時,需要在canny函式外面執行影象降噪的過程。

調整low和high雙閾值,能夠得到不同的邊緣效果。

再看看有雜訊的情況:

# 讀入影象

lenna = cv2.imread("images\\lenna_gauss.png", 0)

# 影象降噪

lenna = cv2.gaussianblur(lenna, (5, 5), 0)

# canny邊緣檢測

效果很差啊,我們調整下高斯模糊的核大小,效果立即好了很多很多。

所以,canny在有雜訊的情況下表現好不好,取決於前面的降噪過程,這也是為什麼opencv將影象降噪放在canny函式外面的原因吧,需要你自己精心調整它。

Canny邊緣檢測

1.canny邊緣檢測基本原理 1 圖象邊緣檢測必須滿足兩個條件 一能有效地抑制雜訊 二必須盡量精確確定邊緣的位置。2 根據對訊雜比與定位乘積進行測度,得到最優化逼近運算元。這就是canny邊緣檢測運算元。3 類似與marr log 邊緣檢測方法,也屬於先平滑後求導數的方法。2.canny邊緣檢測演...

Canny邊緣檢測

canny運算元是邊緣檢測運算元中最常用的一種,是公認效能優良的一種運算元,常被其它邊緣檢測運算元作為標準運算元進行優劣分析。canny演算法基本可以分為3個步驟 平滑 梯度計算 基於梯度值及梯度方向的候選點過濾 1 平滑 影象梯度的計算對雜訊很敏感,因此必須首先對其進行低通濾波。在這裡使用5 5的...

Canny邊緣檢測

canny邊緣檢測演算法 五個步驟 1.高斯模糊 gaussianblur 2.灰度轉換 cvtcolor 3.計算梯度 sobel scharr 4.非最大訊號抑制 5.高低閾值連線輸出二值影象 import cv2 def edge demo image blurred cv2.gaussian...