Canny边缘检测是一种经典的计算机视觉算法,用于在数字图像中检测和提取边缘。这个算法由John F. Canny于1986年提出,它的核心目标是提供一种准确、可靠且高效的边缘检测方法。在OpenCV库中,Canny边缘检测被广泛应用于图像处理和计算机视觉领域。
Canny边缘检测的步骤包括以下几个关键环节:
1. **高斯滤波**:原始图像会通过高斯滤波器进行平滑处理,以消除噪声。在给定的代码中,`blur(gray, edge, Size(3,3))`就是使用3x3的高斯滤波器对灰度图像进行模糊,从而降低噪声对边缘检测的影响。
2. **计算梯度幅度和方向**:接下来,计算图像的梯度幅度和方向。这一步骤有助于识别图像中的强度变化,即潜在的边缘。在OpenCV中,通常使用Sobel算子进行这项操作,但在这个例子中没有直接显示。
3. **非极大值抑制**:为了减少假阳性边缘,Canny算法执行非极大值抑制。它沿着梯度方向比较当前像素的梯度值与相邻像素的值,如果当前像素不是局部最大,则将其设置为零。这有助于消除边缘检测过程中的细小噪声引起的虚假响应。
4. **双阈值检测**:设置两个阈值(在这个例子中是`edgeThresh`和`edgeThresh*3`)来确定哪些边缘应该保留,哪些应该丢弃。低于低阈值的边缘被视为不显著,高于高阈值的边缘被认为是强边缘,而处于两者之间的边缘则根据连接性进行合并或丢弃。
5. **边缘跟踪**:使用hysteresis(滞后)原理来连接弱边缘到强边缘,形成连续的边缘。在OpenCV的Canny函数中,这一过程是自动完成的。
在给出的代码中,`Canny(gray, edge, edgeThresh, edgeThresh*3, 3)`调用了OpenCV的Canny函数,参数依次是输入图像、输出边缘图像、低阈值、高阈值和检测边缘的最大像素梯度。`edgeThresh`可以通过创建的滑动条`createTrackbar`动态调整,以便观察不同阈值下边缘检测的效果。
`onTrackbar`函数在每次阈值改变时被调用,它更新边缘图像,并在名为"Edge map"的窗口中显示结果。`image.copyTo(cedge, edge)`将原始图像中的边缘像素复制到`cedge`中,以可视化边缘位置。
总结来说,Canny边缘检测是通过一系列精细的操作来检测图像中的边缘,这些操作包括预处理、梯度计算、非极大值抑制和双阈值检测,从而在图像处理中提供高质量的边缘检测结果。在OpenCV库中,这个过程被封装在一个方便使用的函数中,使得开发者能够轻松地在自己的项目中应用Canny边缘检测算法。