OpenCV核心内容100讲【第14讲】图像梯度与边缘检测进阶

文摘   2025-01-13 00:00   天津  


14 图像梯度与边缘检测进阶

在本节中,我们将深入学习图像梯度和边缘检测,这是计算机视觉中的一项核心技术。我们将探索OpenCV库中提供的几种算法,帮助我们更准确地识别图像中的边缘。

Sobel算子和Scharr算子

在图像处理中,Sobel算子是用于边缘检测的最常用算法之一。它通过计算图像灰度的水平和垂直方向梯度的近似值来工作,从而捕捉图像的边缘。

Sobel函数的语法如下:

dst = cv2.Sobel(src, ddepth, dx, dy, ksize, scale, delta, borderType)
  • src: 输入图像。
  • ddepth: 输出图像的深度。
  • dx: 水平方向的微分阶数。
  • dy: 垂直方向的微分阶数。
  • ksize: Sobel核的大小。如果设为-1,则使用Scharr算子,这能提供更精确的边缘检测。
  • scale: 计算导数值的缩放因子,默认值是1。
  • delta: 添加到目标图像中的可选增量值,默认值是0。
  • borderType: 图像外延边界的模式。

Scharr算子是Sobel的一种变体,用于更准确的边缘检测。

Laplacian算子

Laplacian算子计算的是图像的二阶导数,它可以补充Sobel算子在边缘检测中的不足。

Laplacian函数的语法如下:

dst = cv2.Laplacian(src, ddepth, ksize, scale, delta, borderType)

参数的含义和Sobel函数相似。

例题1:使用Sobel算子进行边缘检测

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
img = cv2.imread('example.jpg'0)

# 水平和垂直方向的Sobel算子
sobelx = cv2.Sobel(img, cv2.CV_64F, 10, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 01, ksize=5)

# 显示结果
plt.subplot(121), plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

例题2:结合Sobel算子与Laplacian算子进行边缘检测

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
img = cv2.imread('example.jpg'0)

# Sobel算子
sobel_combined = cv2.Sobel(img, cv2.CV_64F, 11, ksize=5)

# Laplacian算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)

# 显示结果
plt.subplot(121), plt.imshow(sobel_combined, cmap='gray')
plt.title('Sobel Combined'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.show()

这个例题通过结合Sobel算子和Laplacian算子展示了如何进行更全面的边缘检测。Sobel算子捕捉到的是图像在水平和垂直方向的一阶导数变化,而Laplacian算子计算了图像的二阶导数,帮助我们识别出更细微的边缘。

Canny边缘检测

除了Sobel和Laplacian算子,Canny边缘检测是另一种常用于检测图像边缘的算法。它具有去噪声并且准确检测图像边缘的特点。

Canny函数的语法如下:

edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)
  • image: 输入图像。
  • threshold1: 第一个阈值用于边缘连接。
  • threshold2: 第二个阈值用于边缘检测。
  • apertureSize: Sobel算子的大小,默认是3。
  • L2gradient: 计算图像梯度幅值的标志,如果设为True,则使用更精确的Euclidean距离,否则使用一个近似值,默认False。

例题3:使用Canny算子进行边缘检测

import cv2
from matplotlib import pyplot as plt

# 读取图像
img = cv2.imread('example.jpg'0)

# Canny边缘检测
edges = cv2.Canny(img, 100200)

# 显示结果
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

在这个例题中,我们使用Canny算子进行边缘检测,这种方法比使用Sobel和Laplacian算子更能清晰地识别和显示图像中的边缘。通过调整threshold1threshold2参数,可以优化检测结果,以捕捉到图像中更细微的边缘。

总结

在本节课中,我们探讨了图像梯度与边缘检测的进阶知识,包括Sobel算子、Scharr算子、Laplacian算子,以及Canny边缘检测算法。通过实际的例题和代码实现,我们演示了这些算法在边缘检测中的应用,并展示了如何使用OpenCV库进行边缘检测和图像梯度的计算。

边缘检测是计算机视觉中的一个基础,但至关重要的技术,理解和掌握这些算法将为后续更高级的图像处理技术打下坚实的基础。

希望这节课的内容能帮助大家更好地理解和应用图像梯度与边缘检测技术。


在公众号【计算机视觉之光】回复 【OpenCV模拟试卷】获得《数字图像处理(OpenCV-Python》模拟试卷及参考答案。
在公众号【计算机视觉之光】回复 【Python试卷】获得《Python程序设计》模拟试卷及参考答案。

单击【阅读原文】参加OpenCV-Python课程学习。

在本公众号【计算机视觉之光】回复关键字“叮叮当当”获取更多的Python学习资料。


计算机视觉之光
电子工业出版社优秀作者,代表作《OpenCV轻松入门》,《计算机视觉40例》。
 最新文章