Logo
Section 1 / 4

边缘检测

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

导入

边缘检测

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

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

边缘检测有助于解决许多实际问题,例如识别形状、文档以及图像中的其他组成部分。本文将介绍三种不同的边缘检测方法:Canny 边缘检测、Laplacian 边缘检测和 Sobel 边缘检测。

首先,我们需要将图像转换为灰度图:

1gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Canny 边缘检测

对于 Canny 边缘检测,我们使用 OpenCV 库中的 cv2.Canny() 函数。该函数需要三个参数,如下所示:

  • 第一个参数是输入图像。
  • 第二个参数是强度梯度的最小值。强度梯度低于该最小值的边缘不会被视为有效边缘。因此,提高最小值会减少检测到的边缘数量。
  • 第三个参数是强度梯度的最大值。强度梯度超过该最大值的像素点会被直接认定为边缘。

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

1cannyEdge = cv2.Canny(gray, 150, 150) 2cv2.imshow('Canny', cannyEdge)

Canny 边缘检测算法包含四个主要阶段:首先使用高斯模糊来降低噪声;然后计算图像的强度梯度;接着进行非极大值抑制,扫描图像并去除不必要的像素;最后一步是滞后阈值处理(hysteresis thresholding),在此阶段,算法根据设定的最小和最大强度值判断所检测的区域是否为真正的边缘。

...
Canny edge detection

Sobel 边缘检测

对于 Sobel 边缘检测,我们使用 OpenCV 库中的 cv2.Sobel() 函数。Sobel 算法基于这样一个事实:在边缘处,像素强度会发生剧烈变化。我们可以利用一阶导数来观察这种变化。梯度变化越大,说明图像内容变化越显著,算法便将这些位置判定为边缘。此外,该算法也使用高斯平滑来减少噪声。

cv2.Sobel() 函数需要四个参数,如下所示:

  • 第一个参数是输入图像。
  • 第二个参数是数据深度,通常使用 cv2.CV_64F,表示 NumPy 数组的 dtype 为 float64(64 位浮点数)。
  • 第三个参数是 dx,表示在 x 方向上的梯度阶数。
  • 第四个参数是 dy,表示在 y 方向上的梯度阶数。
1sobelx_axis = cv2.Sobel(gray, cv2.CV_64F, 1, 0) 2sobely_axis = cv2.Sobel(gray, cv2.CV_64F, 0, 1) 3combined_sobel = cv2.bitwise_or(sobelx_axis, sobely_axis) 4cv2.imshow('Sobel X', sobelx_axis) 5cv2.imshow('Sobel Y', sobely_axis) 6cv2.imshow('Combined Sobel', combined_sobel)

我们分别在 x 和 y 两个方向上进行了 Sobel 边缘检测,然后使用 cv2.bitwise_or() 函数将这两个结果图像合并。

...
Sobel edge detection

Laplacian 边缘检测

对于 Laplacian 边缘检测,我们使用 OpenCV 库中的 cv2.Laplacian() 函数。该算法同样基于边缘处像素强度发生剧烈变化这一特性,但与 Sobel 不同的是,它使用二阶导数来检测边缘。其原理是:在像素强度发生突变的区域,二阶导数为零。

该函数需要两个参数,如下所示:

  • 第一个参数是输入图像。
  • 第二个参数是数据深度,同样使用 cv2.CV_64F,表示 NumPy 数组的 dtype 为 float64(64 位浮点数)。
1lap_Edge = cv2.Laplacian(gray, cv2.CV_64F) 2cv2.imshow('Laplacian', lap_Edge)
...
Laplacian edge detection

示例中展示的不同边缘检测方法呈现出不同类型的边缘特征。可以看出,Canny 边缘检测产生的边缘较粗,而 Laplacian 检测出的边缘更细;Sobel 检测得到的边缘则呈现不连续的特点。水平和垂直方向的 Sobel 检测分别在对应方向上拉伸了边缘。

在集成开发环境(IDE)中的代码应如下所示:

No configuration found for ID: 1881d7255205a37e34ebd8e2114925b92d55ae9c34f4b3f714dedffcbae44bae

恭喜!你已成功使用不同技术实现了边缘检测。

编辑图像

形状检测