文章目录
介绍
Canny边缘检测是一种经典的边缘检测算法,由John F. Canny在1986年提出,被广泛应用于计算机视觉和图像处理领域2。
Canny边缘检测的主要步骤如下1:
- 噪声抑制。首先,通过使用高斯滤波器对图像进行平滑处理,以去除图像中的噪声。
- 计算梯度幅值和方向。使用Sobel算子计算图像中每个像素点的水平和垂直方向的梯度值。然后,根据梯度值计算每个像素点的梯度幅值和方向。
- 非极大值抑制。在计算得到的梯度幅值图像上进行非极大值抑制,将边缘宽度变窄,使边缘更加细化和明确。
- 双阈值处理。根据设定的高阈值和低阈值,将梯度幅值图像中的像素点分为强边缘、弱边缘和非边缘三类。
- 边缘连接。通过连接强边缘像素点和与之相邻的弱边缘像素点,得到完整的边缘图像。
cv2.Canny()
cv2.Canny() 是 OpenCV(一个开源的计算机视觉库)中用于执行 Canny 边缘检测的函数。这个函数的基本语法如下:
edges = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient[, borderType]]]])
参数说明:
- image:输入图像,通常应该是灰度图像。
- threshold1:第一个阈值,用于边缘连接。通常设置为较低的值。
- threshold2:第二个阈值,用于梯度强度的判断。通常设置为较高的值。
- edges:输出边缘图像,是一个与输入图像大小和类型相同的图像。
- apertureSize:Sobel 算子的大小,必须是奇数,并且可以是 3, 5, 7 等。默认值为 3。
- L2gradient:一个布尔值,表示是否使用更精确的 L2 范数来计算图像梯度幅值。默认为 False。
- borderType:像素外插法,用于处理图像边界像素。默认值为 cv2.BORDER_DEFAULT。
threshold1 和 threshold2 是 Canny 边缘检测算法中的两个关键参数。当某个像素点的梯度强度低于 threshold1 时,该像素点被认为是非边缘;当梯度强度高于 threshold2 时,该像素点被认为是边缘;当梯度强度在 threshold1 和 threshold2 之间时,如果它连接到一个“确定的边缘”(即梯度强度大于 threshold2 的像素点),则它也被认为是边缘。
下面是一个使用 cv2.Canny() 的简单示例:
import cv2
import numpy as np
# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用 Canny 边缘检测
edges = cv2.Canny(image, threshold1=30, threshold2=100)
# 显示原始图像和边缘检测后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,我们首先读取一个图像文件并将其转换为灰度图。然后,我们使用 cv2.Canny() 函数对灰度图像执行 Canny 边缘检测,并显示原始图像和检测到的边缘。通过调整 threshold1 和 threshold2 的值,你可以控制检测到的边缘的数量和清晰度。