问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深入解析 Canny 边缘检测:原理、步骤与实践应用全攻略

创作时间:
作者:
@小白创作中心

深入解析 Canny 边缘检测:原理、步骤与实践应用全攻略

引用
CSDN
1.
https://m.blog.csdn.net/qq_54414907/article/details/144017611

Canny边缘检测是一种广泛应用于图像处理和计算机视觉领域的经典边缘检测算法。它通过多步骤处理,能够有效地检测出图像中的边缘信息。本文将深入解析Canny边缘检测的原理、具体步骤,并结合实践案例展示其应用要点。

Canny边缘检测步骤

第一步:去噪

边缘检测的第一步通常是去除图像中的噪声,常用的方法是高斯滤波。高斯滤波的特点是靠近中心的权值比较大,远离中心的权值较小。这种方法可以平滑一些纹理较弱的非轮廓区域。

以一个具体的例子来说明高斯滤波的过程。假设我们有一张图片,其中有一个红色像素点需要进行高斯滤波处理:

使用的高斯卷积核如下:

通过矩阵乘法计算得到的结果为138。这个过程展示了高斯滤波如何通过加权平均来平滑图像。

核的大小对噪声敏感度有重要影响。通常来说,5x5的核足以满足大多数情况。因为边缘的方向是由切向量来定义的,所以梯度的方向与边缘的方向垂直。

高斯核的选取

小高斯核(如3x3)在抑制噪声方面的能力相对较弱。虽然它能够较好地保留图像的细节和边缘的精确位置,但在实际应用中,很多图像都含有一定程度的噪声。如果噪声没有得到有效抑制,就会在边缘检测过程中产生大量的伪边缘。这些伪边缘会干扰真正边缘信息的提取,导致边缘检测结果不准确。

用5x5的高斯核可以在一定程度上有效地平滑图像,减少噪声的影响。例如,在一幅含有椒盐噪声(图像上随机出现的黑白像素点)的图像中,5x5的高斯核能够将这些噪声点周围的像素值进行加权平均,使得噪声引起的像素值突变得到缓解。这样,在后续的边缘检测步骤(如计算梯度幅值和方向)中,就不容易因为噪声的干扰而错误地检测出边缘。

高斯核越大,边缘信息对于噪声的敏感度就越低,但核越大定位错误也会增加。虽然较大的高斯核(如5x5)可能会导致边缘定位出现一些误差,但在很多实际应用场景中,这种误差是可以接受的。因为边缘检测的主要目的通常是获取物体的大致轮廓,而不是精确到像素级别的边缘位置。

相比于小核可能产生的大量伪边缘,大核导致的边缘定位错误相对来说是次要的。如果使用小核,大量的伪边缘会使得后续的边缘连接、轮廓提取等操作变得非常复杂,甚至无法准确地获取物体的完整轮廓。而使用5x5的核可以在减少伪边缘的同时,虽然会有一定的定位错误,但仍然能够提供相对清晰和准确的边缘轮廓。

第二步:计算梯度

计算梯度是边缘检测中的关键步骤。梯度的计算公式为:

G = (Gx^2 + Gy^2)^(1/2)

方向 = arctan2(Gy, Gx)

梯度的方向与边缘垂直,因此在计算梯度时,会得到角度和梯度两个值。具体来说,梯度方向可以分为八个方向:左右上下、左上、左下、右上、右下。

第三步:非极大值抑制

在获得梯度的幅度和方向后,需要进行非极大值抑制。这个过程遍历所有像素点,去掉所有非边缘的点。具体来说,就是判断当前像素点是否是周围具有相同梯度方向的最大值,如果不是最大值就抑制该点。通过非极大值抑制实现边缘细化的目的。

第四步:双阈值确定边缘

双阈值确定边缘分为两小步:

  1. 设置两个阈值max和min。如果梯度>=max,那么标记为强边缘;如果在max>梯度>min,那么标记为弱边缘;如果梯度<min,那么直接删去。
  2. 遍历弱边缘,若与强边缘有连接,那么确定为边缘,没连接删去。

语法与案例

使用OpenCV进行Canny边缘检测的语法如下:

edges = cv2.Canny(待处理8位输入图像image,阈值1 threshold1,阈值2 threshold2,图像梯度幅度L2gradient 默认为False计算速度快,他的图像梯度是二者绝对值之和,而设置为True就是G = (Gx^2 + Gy^2)^(1/2),这样计算的更为准确)

下面通过一个具体的案例来演示Canny边缘检测的应用。我们将使用一张猪的图片(pig.JPG)进行处理:

以下是具体的代码实现:

import numpy as np
import cv2

pig = cv2.imread("pig.JPG")
img1 = cv2.Canny(pig, 128, 200)
img2 = cv2.Canny(pig, 32, 128)

cv2.imshow("original", pig)
cv2.imshow("128-200", img1)
cv2.imshow("32-128", img2)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果可以看出,阈值低的部分可以选择出更多边缘细节。原因如下:当低阈值较小时,更多的像素梯度幅值能够大于低阈值,这就使得更多的像素有机会被标记为弱边缘像素或者强边缘像素。例如,在一个包含一些微弱边缘的图像中,较低的低阈值可以让这些微弱边缘对应的像素梯度幅值超过低阈值,从而被考虑进入边缘检测的后续流程。对于后续的边缘连接等操作,这些被标记为弱边缘的像素有机会与强边缘像素连接起来,最终形成完整的边缘。因为在边缘连接阶段,一些弱边缘像素如果与强边缘像素相邻或者在一定的连接规则下,它们会被判定为边缘的一部分,从而增加了边缘的完整性,捕获到更多的边缘信息。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号