文章目录

介绍

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 的值,你可以控制检测到的边缘的数量和清晰度。

GitHub 加速计划 / opencv31 / opencv
77.37 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
c3747a68 Added Universal Windows Package build to CI. 1 天前
9b635da5 - 1 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐