使用 OpenCV 和深度学习进行整体嵌套边缘检测

opencvdeep learningpython

整体嵌套边缘检测 (HED) 是一种基于深度学习的图像边缘检测方法,可以使用深度学习和 Python 库 OpenCV 执行。整体嵌套边缘检测最初由 Xie 和 Tu 于 2015 年提出,此后已广泛应用于计算机视觉应用。目前,由于它能够在图像中生成准确且高质量的边缘图,近年来它已广受欢迎。

在本文中,我们将讨论 HED 的基础知识、其工作原理以及如何使用 OpenCV 和深度学习以及 Canny 实现它

什么是 HED(整体嵌套边缘检测)?

在计算机视觉中,边缘检测是一项重要任务,涉及识别和定位图像中的尖锐不连续性。图像中的这些不连续性通常用作更复杂的计算机视觉过程(如对象分割和对象检测)的基础。

传统的边缘检测方法使用手工制作的图像特征和启发式方法来识别图像的边缘。这些方法通常受到无法处理复杂结构的边缘或图像纹理或光照的任何变化的限制。

整体嵌套边缘检测是一种基于深度学习的图像边缘检测方法,它通过直接从图像数据中学习边缘特征来克服传统边缘检测方法的局限性。它使用深度卷积神经网络 (CNN) 创建一组分层边缘图,其中每个图代表不同比例的边缘。

使用 OpenCV 和深度学习执行整体嵌套边缘检测的步骤

按照下面给出的步骤使用 OpenCV 和深度学习执行整体嵌套边缘检测 −

  • 导入必要的库。我们导入 cv2 进行图像处理,导入 numpy 进行数值运算。

  • 使用 cv2.dnn.readNetFromCaffe() 加载预训练的边缘检测模型。我们需要提供两个文件的路径:deploy.prototxt 和 hed_pretrained_bsds.caffemodel。这些文件分别包含模型的架构和权重。

  • 使用 cv2.imread() 加载输入图像,并将其调整为 512 x 512 像素的较小尺寸。将图像调整为较小尺寸是可选的,但它可以帮助加快边缘检测过程。

  • 然后,我们加载输入图像并将其调整为最大 1000 像素以加快处理速度。我们使用 cv2.cvtColor() 将调整大小的图像转换为灰度。

  • 我们还为该函数提供了一些其他参数,例如比例因子、图像大小、平均值等。这些值特定于我们正在使用的预训练模型。

  • 使用 cv2.Canny() 将 Canny 边缘检测应用于灰度图像。这有助于检测图像中的强边缘。

  • 我们使用预先训练的模型执行整体嵌套边缘检测。我们首先使用 model.setInput() 将输入设置为模型。我们将灰度图像的 blob 作为输入传递。

  • 我们使用 cv2.threshold() 对输出图像进行阈值处理以获取二进制边缘。我们使用 Otsu 阈值方法,该方法会自动计算最佳阈值。

  • 最后,我们使用 model.forward() 获得模型的输出。

  • 使用 cv2.imshow() 显示输入图像、Canny 边缘和 HED 边缘,并等待用户按下某个键,然后使用 cv2.waitKey() 和 cv2.destroyAllWindows() 关闭窗口。

示例

import cv2
import numpy as np

# 加载预先训练的 HED 模型
hed_model = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel")

# 加载输入图像
image = cv2.imread("sample2.jpg")

# 调整图像大小以加快处理速度
height, width = image.shape[:2]
max_size = max(height, width)
scale = 1.0
if max_size > 1000:
scale = 1000.0 / max_size
resized = cv2.resize(image, None, fx=scale, fy=scale)

# 将图像转换为灰度
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
# 将 Canny 边缘检测应用于灰度图像
canny = cv2.Canny(gray, 100, 200)
# 将 HED 应用于彩色图像
hed_model.setInput(cv2.dnn.blobFromImage(resized, scalefactor=1.0, size=(width, height), mean=(104.00698793, 116.66876762, 122.67891434), swapRB=False, crop=False))
hed = hed_model.forward()
hed = np.squeeze(hed)

# 将 HED 输出转换为二进制图像
hed = np.squeeze(hed)
hed = np.uint8(hed * 255)
hed_edges = cv2.convertScaleAbs(hed)
ret, hed_edges = cv2.threshold(hed_edges, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 对输出图像进行阈值处理以获取二进制边缘
ret, hed_edges = cv2.threshold(hed, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示输入和输出图像
cv2.imshow("Input", resized)
cv2.imshow("Canny", canny)
cv2.imshow("HED", hed_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出

结论

总之,整体嵌套边缘检测 (HED) 是一种强大的图像边缘检测技术,可提供高质量的结果和高精度。它基于深度学习算法,可以学习和适应不同的图像变化和结构,这使其适用于图像处理和计算机视觉中的广泛应用。我们了解到,OpenCV 为整体嵌套边缘检测提供了一个方便的框架,是执行边缘检测的有效方法之一。


相关文章