Canny算子是一种经典的边缘检测算法,于1986年由John Canny提出。相比其他边缘检测算法,Canny算子具有以下特点:
高准确性:Canny算子能够对图像中真实边缘进行准确检测,并尽量排除非边缘部分的干扰。
低错误率:Canny算子在边缘检测过程中,能够尽量减少错误的边缘检测,即将噪声和细节等误判为边缘的情况。
单一响应:对于明显的边缘,Canny算子能够产生单一像素宽度的边缘响应。
Canny算子的步骤如下:
噪声抑制:利用高斯滤波器对输入图像进行平滑处理,以减少图像中的噪声。
梯度计算:通过对平滑后的图像应用Sobel(或Prewitt)算子,计算每个像素点的梯度幅值和方向。
非极大值抑制:在梯度图像上,对每个像素点在其梯度方向上进行比较,并保留局部最大值点,抑制非边缘像素。
双阈值检测:根据设定的高阈值和低阈值,将梯度图像中的像素点分为强边缘、弱边缘和非边缘三个部分。
边缘连接:通过连接强边缘像素和与之相连的弱边缘像素,形成完整的边缘。
下面是一个使用OpenCV库实现Canny算子的简单例程:
- import cv2
-
- # 读取输入图像
- image = cv2.imread("input.jpg", cv2.IMREAD_GRAYSCALE)
-
- # 使用Canny算子进行边缘检测
- edges = cv2.Canny(image, 100, 200)
-
- # 显示结果
- cv2.imshow("Input Image", image)
- cv2.imshow("Canny Edges", edges)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
在这个例程中,首先使用cv2.imread()
函数读取输入图像,并将其转换为灰度图像。
然后,我们使用cv2.Canny()
函数对灰度图像进行Canny边缘检测。函数的参数包括输入图像、高阈值和低阈值。这两个阈值用于控制边缘的强度,一般建议高阈值为低阈值的两倍到三倍。
最后,使用cv2.imshow()
函数显示原始图像和Canny边缘检测结果。使用cv2.waitKey(0)
等待用户按下任意按键后关闭窗口并结束程序。
请确保将代码中的"input.jpg"替换为您要进行边缘检测的实际图像的路径。此外,确保已安装OpenCV库并正确配置Python环境。