基于OpenCV和深度学习的整体嵌套边缘检测
整体嵌套边缘检测 (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
# Load the pre-trained HED model
hed_model = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel")
# Load the input image
image = cv2.imread("sample2.jpg")
# Resize the image for faster processing
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)
# Convert the image to grayscale
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
# Apply Canny edge detection to the grayscale image
canny = cv2.Canny(gray, 100, 200)
# Apply HED to the color image
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)
# Convert the HED output to a binary image
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)
# Threshold the output image to obtain binary edges
ret, hed_edges = cv2.threshold(hed, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# Display the input and output images
cv2.imshow("Input", resized)
cv2.imshow("Canny", canny)
cv2.imshow("HED", hed_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出



结论
总之,整体嵌套边缘检测 (HED) 是一种强大的图像边缘检测技术,可提供高质量的结果和高精度。它基于深度学习算法,可以学习和适应不同的图像变化和结构,这使其适用于图像处理和计算机视觉领域的各种应用。我们了解到 OpenCV 为整体嵌套边缘检测提供了一个便捷的框架,并且是执行边缘检测的有效方法之一。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP