文章目录
- 前言
- 一、canny检测的流程
- 1.高斯滤波(Gaussian Smoothing)
- 2.梯度计算(Gradient Calculation)
- 3.非极大值抑制(Non-maximum Suppression)
- 4.双阈值检测(Double Thresholding)
- 5.边缘跟踪与连接(Edge Tracking and Hysteresis)
- 二、代码实现
前言
Canny边缘检测是计算机视觉领域中常用的一种边缘检测算法,它由约翰·凯恩(John Canny)于1986年提出,是一种多阶段的算法,具有较好的性能和准确性。Canny边缘检测算法的主要优点包括良好的边缘定位精度、抑制噪声的能力以及对边缘连接的稳健性。然而,它也存在一些缺点,如计算复杂度较高、对参数的敏感性等。因此,在实际应用中,需要根据具体情况进行参数调整和优化。
一、canny检测的流程
1.高斯滤波(Gaussian Smoothing)
Canny边缘检测的第一步是使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。高斯滤波器我们上节课已经讲过了,这里就不重复了。
2.梯度计算(Gradient Calculation)
接下来,对平滑后的图像使用Sobel、Prewitt或其他梯度算子计算图像中每个像素点的梯度值和方向。这一步用于检测图像中的边缘。
3.非极大值抑制(Non-maximum Suppression)
在第二步梯度计算中,每个像素点都被赋予了一个梯度幅值和一个梯度方向。然后,非极大值抑制的目标是通过扫描图像,对每个像素点进行检查,并在梯度方向上比较该像素点与其相邻两个像素点的梯度幅值,只保留梯度幅值最大的像素点,而抑制其他像素点。这样做的结果是,在梯度图像中只保留了沿着边缘方向上梯度最大的像素点,其他像素点被抑制或抑制掉。这种抑制机制有助于细化边缘并减少边缘检测结果中的杂散响应,使得边缘更加清晰和准确。
具体来说,对于每个像素点,算法的步骤如下:
1>确定当前像素点的梯度方向。
2>在梯度方向上,找到与当前像素点相邻的两个像素点。
3>比较当前像素点与其相邻两个像素点的梯度幅值。
4>如果当前像素点的梯度幅值最大,则保留该像素点;否则,抑制该像素点。
4.双阈值检测(Double Thresholding)
双阈值检测(Double Thresholding)是Canny边缘检测算法的第四个步骤,它用于将梯度图像中的像素点分成三类:强边缘像素、弱边缘像素和非边缘像素,以便后续的边缘连接处理。
具体来说,双阈值检测的步骤如下:
设定两个阈值:首先,需要设定两个阈值,分别是高阈值(High Threshold)和低阈值(Low Threshold)。这两个阈值的选择是根据具体应用而定的,通常高阈值设定为强边缘像素的阈值,低阈值设定为弱边缘像素的阈值。中间值可以根据需要进行调整。
像素分类:对梯度图像中的每个像素点进行分类:
a.如果像素的梯度幅值大于高阈值,则将其标记为强边缘像素。
b.如果像素的梯度幅值介于低阈值和高阈值之间,则将其标记为弱边缘像素。
c.如果像素的梯度幅值小于低阈值,则将其标记为非边缘像素。
边缘连接处理:在双阈值检测之后,强边缘像素被认为是最可能的边缘,而弱边缘像素可能是边缘的一部分,也可能是噪声。因此,接下来需要进行边缘连接处理,将弱边缘像素连接到强边缘像素,形成完整的边缘。
双阈值检测的作用是将梯度图像中的像素点进行分门别类,为后续的边缘连接处理提供依据。这种分类策略有助于过滤掉一些低梯度幅值的像素点,减少噪声对边缘检测结果的影响,并保留梯度幅值较大的像素点作为潜在的边缘点。
5.边缘跟踪与连接(Edge Tracking and Hysteresis)
边缘跟踪与连接是Canny边缘检测算法中的最后一步,它的目的是将弱边缘像素连接成强边缘,从而形成连续的边缘线。在Canny边缘检测的前几个步骤中,我们得到了两类边缘像素:强边缘像素和弱边缘像素。强边缘像素是那些梯度值超过高阈值的像素,而弱边缘像素是那些梯度值介于低阈值和高阈值之间的像素。边缘跟踪与连接的基本思想是从强边缘像素出发,沿着梯度方向追踪连接其周围的弱边缘像素,直到无法继续连接为止。这样就形成了一条连续的边缘线。
二、代码实现
# Canny 边缘检测
edges1 = cv2.Canny(image, threshold1=100, threshold2=200, apertureSize=3)
edges2 = cv2.Canny(image, threshold1=50, threshold2=100, apertureSize=3)
# 显示结果
cv2.imshow("Original Image", image)
cv2.imshow("Canny Edges1", edges1)
cv2.imshow("Canny Edges2", edges2)
cv2.waitKey(0)
cv2.destroyAllWindows()
threshold1 和 threshold2:两个阈值参数,用于控制边缘检测的灵敏度。如果图像梯度值高于 threshold2,则被认为是强边缘像素;如果图像梯度值低于 threshold1,则被认为是非边缘像素;介于这两个阈值之间的像素被认为是弱边缘像素。一般建议将 threshold1 设置为 threshold2 的一半到两倍之间。
当我们threshold1设置较小时 可以看到上图,出现的边缘就会更多。因为threshold1 控制了边缘检测的低阈值,如果一个像素的梯度值低于 threshold1,则被认为是非边缘像素,而高于 threshold1 的像素会被进一步检查。如果高于 threshold1 的像素的梯度值高于 threshold2,则被认为是强边缘像素;如果梯度值介于 threshold1 和 threshold2 之间,则被认为是弱边缘像素。
因此,当 threshold1 设置得较小时,更多的像素会被认为是弱边缘像素,进而会有更多的弱边缘像素被连接成边缘。这样就会导致检测到的边缘数量增加。但需要注意的是,设置过小的 threshold1 值可能会导致边缘检测结果中包含大量的噪声或无用的边缘,因此需要根据具体情况进行调整。