Logo
Section 1 / 5

边缘检测

了解不同类型的边缘检测方法,并学习如何使用这些技术进行边缘检测。

导入

边缘检测

了解不同类型的边缘检测方法,并学习如何使用这些技术进行边缘检测。

OpenCV 最常见的用途之一是检测图像中的形状、边缘、人脸及其他各种组件。在本章中,我们将学习其中一些检测方法。

检测边缘有助于解决许多实际问题,例如识别形状、文档以及图像中的其他组成部分。它还可用于指纹识别、医学影像分析和车辆检测等场景。接下来,我们将介绍两种不同的边缘检测方法:

  • Canny 边缘检测
  • Sobel 边缘检测

首先,我们需要将图像转换为灰度图。将图像转为灰度非常重要,因为边缘检测算法依赖于灰度图像来准确识别边缘。灰度图像能够简化算法处理过程,并降低计算复杂度。

1cv::cvtColor(img, src_gray, cv::COLOR_BGR2GRAY);

Canny 边缘检测

在 Canny 边缘检测中,我们使用 OpenCV 库中的 Canny() 函数。该函数需要四个参数,具体如下:

  • 第一个参数是输入图像。
  • 第二个参数是输出图像。
  • 第三个参数是最小梯度强度值。梯度强度低于此值的区域不被视为边缘。因此,提高最小值会减少检测到的边缘数量。
  • 第四个参数是最大梯度强度值。梯度强度高于此值的区域被认定为边缘。

介于这两个阈值之间的像素,根据其连通性被分类为边缘或非边缘。

1cv::Canny(src_gray, canny_img, 150, 150);

Canny 边缘检测算法包含四个主要步骤:

  1. 首先使用高斯模糊来降低噪声。
  2. 接着计算图像的梯度强度。
  3. 进行非极大值抑制,扫描图像并去除不必要的像素点。
  4. 最后一步是滞后阈值处理。算法根据传入的最小和最大强度值判断检测到的边缘是否有效。

No configuration found for ID: 063f0d2e70343e470fba914679124d17b322ffcf013c1f5367a65b517719956d

Sobel 边缘检测

在 Sobel 边缘检测中,我们使用 OpenCV 库中的 Sobel() 函数。Sobel 检测算法基于一个原理:在边缘处,像素强度会发生显著变化。我们可以利用一阶导数来捕捉这种变化。梯度变化越大,表示图像中存在越明显的结构变化,这些点就被判定为边缘。该算法同时结合高斯平滑进行降噪处理。

1cv::Sobel(src_gray, outputImg, CV_64F, xGradient, yGradient);

Sobel() 函数需要五个参数,具体如下:

  • 第一个参数是输入图像。
  • 第二个参数是输出图像。
  • 第三个参数是数据深度,这里使用 CV_64F,表示图像矩阵的数据类型为 64 位浮点型(float64)。
  • 第四个参数是 x 方向上的梯度值。
  • 第五个参数是 y 方向上的梯度值。

下面的代码展示了三种不同图像的显示效果。请按键盘任意键查看下一张图像。

No configuration found for ID: 28e46005ddbc3c4918cb1b7490712f09ce84d95a514ac91559fc204410c7849e

祝贺!我们已成功通过两种不同技术完成了边缘检测。

编辑图像

轮廓检测