摘要:雖然邊低于,但它連接到邊,因此也被視為有效邊,我們得到完整的曲線。但邊緣雖然高于并且與邊緣的區域相同,但它沒有連接到任何真實邊緣,因此被丟棄。
Canny Edge Detection
Canny邊緣檢測是一種流行的邊緣檢測算法.它是由John F. Canny開發的,
這是一個多階段算法.
減少噪音
由于邊緣檢測易受圖像中的噪聲影響,因此第一步是使用5x5高斯濾波器去除圖像中的噪聲.
計算圖像梯度
對平滑后的圖像使用sobel算子在水平與豎直方向上計算一階導數,得到圖像梯度(Gx和Gy)。根據梯度圖找到邊界梯度和方向
$$ Edge\_Gradient ; (G) = sqrt{G_x^2 + G_y^2} $$
$$ Angle ( heta) = an^{-1} igg(frac{G_y}{G_x}igg) $$
梯度方向一般與邊界垂直,有四類:垂直、水平、兩個對角線
非極大值抑制
在獲得梯度幅度和方向之后,完成圖像的全掃描以去除可能不構成邊緣的任何不需要的像素.為此,在每個像素處,檢查像素是否是其在梯度方向上的鄰域中的局部最大值.
A點位于邊緣(垂直方向),梯度方向與邊緣垂直. B點和C點處于梯度方向。 因此,用點B和C檢查點A,看它是否形成局部最大值.如果是這樣,則考慮下一階段,否則,它被抑制(置零).
滯后閾值
這個階段決定哪些邊緣是邊緣,哪些邊緣不是邊緣. 為此,我們需要兩個閾值,minVal和maxVal. 強度梯度大于maxVal的邊緣肯定是邊緣,而minVal以下的邊緣肯定是非邊緣的,因此被丟棄. 兩者之間的值要判斷是否與真正的邊界相連,相連就保留,不相連舍棄.
邊緣A高于maxVal,因此被視為“真實邊緣”。
雖然邊C低于maxVal,但它連接到邊A,因此也被視為有效邊,我們得到完整的曲線。
但邊緣B雖然高于minVal并且與邊緣C的區域相同,但它沒有連接到任何“真實邊緣”,因此被丟棄。
因此,我們必須相應地選擇minVal和maxVal才能獲得正確的結果
我們最終得到的是圖像中的強邊緣
OpenCV中的Canny邊緣檢測cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
image:輸入圖像
threshold1和threshold2:minVal和maxVal
apertureSize:用于查找圖像漸變的Sobel內核的大小,3(默認)
L2gradient:指定用于查找梯度幅度的等式,如果它是True,它使用上面提到的更準確的等式,否則它=False(默認)使用:
$$Edge\_Gradient ; (G) = |G_x| + |G_y|$$
代碼:
import cv2 from matplotlib import pyplot as plt img = cv2.imread("img.jpg",0) edges = cv2.Canny(img,100,200) plt.subplot(121),plt.imshow(img,cmap = "gray") plt.title("Original Image"), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(edges,cmap = "gray") plt.title("Edge Image"), plt.xticks([]), plt.yticks([]) plt.show()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42007.html
閱讀 3793·2021-11-12 10:34
閱讀 2812·2021-09-22 15:14
閱讀 778·2019-08-30 15:53
閱讀 3196·2019-08-30 12:53
閱讀 1280·2019-08-29 18:32
閱讀 2761·2019-08-29 16:41
閱讀 1056·2019-08-26 13:40
閱讀 1795·2019-08-23 18:07