Canny边缘检测
Canny Edge Detection算法原理
Canny边缘检测是一个多阶段的算法,包括以下几个步骤:
-
噪声抑制:使用高斯滤波器对输入图像进行平滑处理,以降低噪声对边缘检测的影响。高斯滤波可以有效地去除图像中的高频噪声。
-
计算梯度:使用Sobel算子计算图像的水平和垂直方向上的梯度。这一步旨在捕捉图像中的边缘信息。通过计算梯度的幅值和方向,可以确定图像中的边缘位置和边缘的方向。
-
非极大值抑制:在梯度图像上执行非极大值抑制,目的是细化边缘以获得更准确的结果。该步骤会检查每个像素点周围的邻域,判断当前像素是否为沿着梯度方向的局部最大值,如果是,则保留该像素作为边缘点,否则将其抑制。
-
双阈值处理:使用两个阈值(高阈值和低阈值)来确定哪些边缘属于真正的边缘。高阈值用于初始的边缘选取,低阈值用于连接被高阈值选取的边缘上的弱边缘。如果一个边缘像素的梯度值大于高阈值,则视为强边缘;如果梯度值处于高阈值和低阈值之间,则仅在其周围有强边缘时才被视为边缘,否则被认为是噪声。
-
边缘跟踪:根据双阈值处理后的结果,通过连接强边缘像素,形成完整的边缘线条。
cv.Canny()函数
Canny边缘检测是一种经典的边缘检测算法,它可以有效地检测图像中的边缘。在OpenCV中,可以使用cv.Canny()函数来实现Canny边缘检测。
cv.Canny()函数的语法如下:
edges = cv.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)
参数解释:
- image:要进行边缘检测的输入图像,必须为单通道灰度图像。
- threshold1:边缘检测中的低阈值,用于边缘强度的下界。
- threshold2:边缘检测中的高阈值,用于边缘强度的上界。
- apertureSize:Sobel算子的孔径大小,默认为3。
- L2gradient:一个布尔值,指定计算梯度幅值的方法。如果设置为True,使用更精确但稍慢的L2范数;如果设置为False,使用默认的L1范数。默认为False。
函数返回一个包含边缘信息的二值图像,其中白色表示边缘,黑色表示非边缘。
import cv2 as cv
# 读取图像
image = cv.imread('image.jpg', cv.IMREAD_GRAYSCALE)
# 应用Canny边缘检测
edges = cv.Canny(image, 100, 200)
# 显示结果
cv.imshow('Canny Edge Detection', edges)
cv.waitKey(0)
cv.destroyAllWindows()