《OpenCV》 Canny 邊緣檢測

2021-09-25 03:13:51 字數 1710 閱讀 8138

(1)去噪

邊緣檢測容易受到影象中雜訊的影響,故首先需要用5x5的高斯濾波器去除影象中的雜訊。

(2)計算影象的強度梯度

將去噪(平滑)後的影象由sobel核心分別在水平和垂直方向上求導(一階微分),得到gx和gy。根據這兩幅梯度圖,求得每個畫素的邊緣梯度大小和方向。

(3)非極大值抑制

得到梯度大小和方向後,對影象進行全掃瞄,去除可能不構成邊緣的任何不需要的畫素。故在每個畫素處,檢查畫素在梯度方向上是否為其鄰域內的區域性最大值。

如下圖,a點位於邊緣上,即垂直線,其梯度方向與邊緣線方向垂直,點b和點c位於梯度方向上,所以檢查a與b、c以檢視a是否是區域性最大值,如果是進入下一步,如果不是則置為0。

(4)滯後閾值法

此階段在邊緣線中哪些是真正需要檢測的邊緣,哪些不是。對此,需要兩個閾值,minval和maxval。任何強度梯度大小大於maxval的邊緣都被認為是要留下的邊緣,而那些梯度值小於minval的邊緣都被丟棄,認為是非邊緣。剩下的梯度值位於這兩個閾值之間的根據它們的連通性再將其劃分到邊緣或非邊緣中。如果它們能夠連線到已被確認為邊緣的一些邊緣上,則也將它們視為邊緣的一部分,否則丟棄。

如下圖,邊緣a梯度值大於maxvalue,被置為『sure-edge』,儘管邊緣c梯度值小於maxval,但由於c與a連線,故c也被置為是有效邊緣,最終得到整條曲線。而邊緣b儘管其梯度值大於minval,但由於其不能連線到任意一條'sure-edge'上,所以b被丟掉。

這個階段基於邊緣是長線的假設,也消除了小畫素雜訊。

# 以灰度格式讀取影象,檢測邊緣時靠強度(亮度)變化,與顏色不太相關

img_yuan_gray = cv2.imread('image/7e_bir9il{}5%0rkik_$f62.png', cv2.imread_grayscale)

print(img_yuan_gray.dtype)

'''canny邊緣檢測

'''img_edgs_canny = cv2.canny(img_yuan_gray,100,300,aperturesize=3,l2gradient=true)

cv2.imshow('img_yuan_gray', img_edgs_canny)

cv2.waitkey(0)

cv2.destroyallwindows()

原圖如下:

梯度圖:

結果如下:

附註:

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邊緣檢測

原影象 cv imshow 原影象 imagesource cv mat image cv gaussianblur imagesource,image,cv size 3,3 0 過濾 cv canny image,image,50,100 邊緣檢測 第乙個引數 輸入影象 八位的影象 第二個引數 ...