OpenCV sobel() 函数

Manav Narula 2024年2月15日
  1. 在 Python 中使用 Sobel() 函数进行边缘检测
  2. 结论
OpenCV sobel() 函数

使用 OpenCV 库,我们可以对图像进行处理和应用各种技术。这些过程构成了复杂的计算机视觉任务的一个组成部分,其中一项任务是图像中的边缘检测。

边缘是图像中对象的边界或轮廓,与像素密度的非常大的变化相关联。通过比较相邻像素的密度,我们可以检测边缘。

各种算法可用于边缘检测并应用于 OpenCV 库。一种这样的技术是 Sobel 边缘检测算法。

本教程将演示在 Python 中使用 OpenCV 的 Sobel 算法。

在 Python 中使用 Sobel() 函数进行边缘检测

Sobel 边缘检测算法使用图像梯度来预测和查找图像中的边缘。我们使用该算法比较像素密度以检测边缘。

我们计算函数的一阶导数以找到峰值点。然后将它们与阈值进行比较。

在这种技术中,Sobel 算子计算函数的梯度。它结合了高斯平滑和微分。

通常,我们使用内核来平滑或模糊图像,但在这种情况下,我们将使用它们来计算梯度。沿 x 和 y 轴计算导数。

使用这两个值计算给定点的梯度。该梯度值不易产生噪声,然后用于边缘检测。

OpenCV 库使用 Sobel() 函数来实现这一点。我们需要指定带有几个参数的函数以及图像。

我们需要提及最终图像的深度,由 ddepth 参数指定。值为 -1 时,输出图像将与输入图像具有相同的深度。

使用 dxdy 参数指定要使用的导数的顺序。使用 ksize 参数提及扩展 Sobel 内核的大小。

scaledelta 参数是可选的。现在让我们看一个例子。

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

沿 X 和 Y 轴使用 Sobel 进行边缘检测

在上面的例子中,我们使用了 Sobel() 函数。我们计算了沿 x 和 y 轴的一阶导数并获得了梯度,然后将其用于查找轮廓。

最终图像为 64 位,如 ddepth 参数中所指定。使用的内核大小为 5x5。

注意 GaussianBlur() 函数;它用于模糊给定图像,Sobel 算子在模糊图像上效果最好。waitKey()destroyAllWindows() 函数阻止输出窗口关闭并等待用户按下某个键退出。

如前所述,我们在上例中计算了沿 x 轴和 y 轴的导数。我们还可以通过将另一个轴的导数设为 0 来计算沿任一轴的导数。

例如,

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

沿 X 轴使用 Sobel 进行边缘检测

在上面的代码中,我们只计算沿水平方向的导数,并将 dy 参数的值设置为 0。要计算垂直方向的导数,我们将 dx 参数设置为 0。

请注意,在我们的示例中,我们使用的内核大小为 5x5。我们也可以使用 3x3 大小,但在这种情况下结果包含许多不准确之处,不推荐使用。

Scharr 过滤器是另一个类似于 Sobel 的算子,可用于 3x3 的情况。

结论

本教程演示了如何使用 OpenCV 库中的 Sobel() 函数。我们首先从了解用于边缘检测的 Sobel 算法开始。

我们了解了图像梯度的基础知识以及 Sobel 算子如何有效地计算它。文章中演示了不同情况的示例。

还讨论了使用 3x3 内核的缺点,在这种情况下,可以使用其替代方案 Scharr 滤波器来提供更好的结果。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相关文章 - Python OpenCV

相关文章 - OpenCV Image