摘要:虽然边低于,但它连接到边,因此也被视为有效边,我们得到完整的曲线。但边缘虽然高于并且与边缘的区域相同,但它没有连接到任何真实边缘,因此被丢弃。
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()
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42007.html
阅读 3819·2021-11-12 10:34
阅读 2826·2021-09-22 15:14
阅读 796·2019-08-30 15:53
阅读 3210·2019-08-30 12:53
阅读 1301·2019-08-29 18:32
阅读 2780·2019-08-29 16:41
阅读 1076·2019-08-26 13:40
阅读 1823·2019-08-23 18:07