canny 邊緣檢測演算法是 john f. canny 於2023年開發出來的乙個多級邊緣檢測演算法,也被很多人認為是邊緣檢測的最優演算法。
降噪由於邊緣檢測容易受到影象中雜訊的影響,因此第一步是使用5x5高斯濾波器消除影象中的雜訊。
計算梯度值和梯度方向
通過點乘乙個sobel或其它運算元得到不同方向的梯度值 gx,
g_x ,
gx,
g
yg_y
gy。
綜合梯度通過以下公式計算梯度值和梯度方向:
e dg
e_gr
adie
nt(g
)=gx
2+gy
2ang
le(θ
)=tan−1
(gyg
x)edge\_gradient \; (g) = \sqrt \\ angle \; (\theta) = \tan^ \bigg(\frac\bigg)
edge_g
radi
ent(
g)=g
x2+
gy2
ang
le(θ
)=tan−1(
gxg
y)
非極大值抑制
在高斯濾波過程中,邊緣有可能被放大了。這個步驟使用乙個規則來過濾不是邊緣的點,使邊緣的寬度盡可能為1個畫素點:如果乙個畫素點屬於邊緣,那麼這個畫素點在梯度方向上的梯度值是最大的。否則不是邊緣,將灰度值設為0。
使用上下閥值來檢測邊緣
該階段確定哪些邊緣全部是真正的邊緣,哪些不是。為此,我們需要兩個閾值minval和maxval。強度梯度大於maxval的任何邊緣必定是邊緣,而小於minval的那些邊緣必定是非邊緣,因此將其丟棄。介於這兩個閾值之間的物件根據其連通性被分類為邊緣或非邊緣。如果將它們連線到「邊緣」畫素,則將它們視為邊緣的一部分。否則,它們也將被丟棄。見下圖:
邊緣a在maxval之上,因此被視為「確定邊緣」。儘管邊c低於maxval,但它連線到邊a,因此也被視為有效邊,我們得到了完整的曲線。但是邊緣b儘管在minval之上並且與邊緣c處於同一區域,但是它沒有連線到任何「確保邊緣」,因此被丟棄。因此,非常重要的一點是我們必須相應地選擇minval和maxval以獲得正確的結果。
cv_exports_w void
canny
( inputarray image, outputarray edges,
double threshold1,
double threshold2,
int aperturesize =3,
bool l2gradient =
false
);
@param image // 8位輸入影象。
@param邊緣 //輸出邊緣圖; 單通道8位影象,其大小與image相同。
@param threshold1 //下閾值minval。
@param threshold2 //上閾值maxval。
@param holesize //sobel運算子的範圍大小。
@param l2gradient //乙個標誌,指示是否應使用更準確的l
2l_2
l2 norm =(d
i/dx
)2+(
di/d
y)2=\sqrt
=(di/d
x)2+
(di/
dy)2
來計算影象梯度幅度(l2gradient = true),或者使用預設值l
1l_1
l1 norm =∣d
i/dx
∣+∣d
i/dy
∣=|di/dx|+|di/dy|
=∣di/d
x∣+∣
di/d
y∣就已經足夠(l2gradient = false)。
int
main()
原圖:
結果:
opencv Canny邊緣檢測
opencv 中的 canny 邊緣檢測 了解 canny 邊緣檢測的概念 學習函式 cv2.canny 1 原理 canny 邊緣檢測是一種非常流行的邊緣檢測演算法,是 john f.canny 在1986 年提出的。它是乙個有很多步構成的演算法,我們接下來會逐步介紹。1.1 雜訊去除 由於邊緣檢...
OpenCV Canny邊緣檢測
文章介紹如何用opencv python來使用canny運算元。本文介紹使用opencv python實現基本的濾波處理 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的 影象處理與計算機視覺演算法及應用 第2版 原型 opencv python中canny函式...
《OpenCV》 Canny 邊緣檢測
1 去噪 邊緣檢測容易受到影象中雜訊的影響,故首先需要用5x5的高斯濾波器去除影象中的雜訊。2 計算影象的強度梯度 將去噪 平滑 後的影象由sobel核心分別在水平和垂直方向上求導 一階微分 得到gx和gy。根據這兩幅梯度圖,求得每個畫素的邊緣梯度大小和方向。3 非極大值抑制 得到梯度大小和方向後,...