边缘检测
了解不同类型的边缘检测方法,并学习如何使用这些技术进行边缘检测。
OpenCV 最常见的用途之一是检测图像中的形状、边缘、人脸及其他各种组件。在本章中,我们将学习其中一些检测方法。
检测边缘有助于解决许多实际问题,例如识别形状、文档以及图像中的其他组成部分。它还可用于指纹识别、医学影像分析和车辆检测等场景。接下来,我们将介绍两种不同的边缘检测方法:
- Canny 边缘检测
- Sobel 边缘检测
首先,我们需要将图像转换为灰度图。将图像转为灰度非常重要,因为边缘检测算法依赖于灰度图像来准确识别边缘。灰度图像能够简化算法处理过程,并降低计算复杂度。
1cv::cvtColor(img, src_gray, cv::COLOR_BGR2GRAY);
Canny 边缘检测
在 Canny 边缘检测中,我们使用 OpenCV 库中的 Canny() 函数。该函数需要四个参数,具体如下:
- 第一个参数是输入图像。
- 第二个参数是输出图像。
- 第三个参数是最小梯度强度值。梯度强度低于此值的区域不被视为边缘。因此,提高最小值会减少检测到的边缘数量。
- 第四个参数是最大梯度强度值。梯度强度高于此值的区域被认定为边缘。
介于这两个阈值之间的像素,根据其连通性被分类为边缘或非边缘。
1cv::Canny(src_gray, canny_img, 150, 150);
Canny 边缘检测算法包含四个主要步骤:
- 首先使用高斯模糊来降低噪声。
- 接着计算图像的梯度强度。
- 进行非极大值抑制,扫描图像并去除不必要的像素点。
- 最后一步是滞后阈值处理。算法根据传入的最小和最大强度值判断检测到的边缘是否有效。
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
祝贺!我们已成功通过两种不同技术完成了边缘检测。