OpenCV 和深度学习执行全方位嵌套边缘检测
全方位嵌套边缘检测(HED)是一种基于深度学习的图像边缘检测方法,可以使用深度学习和Python库OpenCV来实现。全方位嵌套边缘检测最早由谢和兔于2015年提出,并在计算机视觉应用中得到广泛应用。近年来,由于其能够在图像中生成准确且高质量的边缘地图,它越来越受到欢迎。
在本文中,我们将讨论HED的基础知识,工作原理以及如何使用OpenCV和深度学习以及Canny算法来实现它。
什么是全方位嵌套边缘检测(Holistically-Nested Edge Detection)
在计算机视觉中,边缘检测是一项重要任务,它涉及识别和定位图像中的锐利不连续性。这些图像中的不连续性通常被用作更复杂的计算机视觉过程(如对象分割和对象检测)的基础。
传统的边缘检测方法使用手工设计的图像特征和启发式算法来识别图像的边缘。这些方法通常受限于无法处理复杂结构的边缘或图像纹理或光照的变化。
全方位嵌套边缘检测是基于深度学习的一种检测图像边缘的方法,它通过直接从图像数据中学习边缘特征来克服传统边缘检测方法的局限性。它使用深度卷积神经网络(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()
输出
结论
综上所述,Holistically-Nested Edge Detection(HED)是一种强大的图像边缘检测技术,具有优质的结果和高准确性。它基于深度学习算法,可以学习和适应不同的图像变化和结构,使其适用于图像处理和计算机视觉的广泛应用。我们了解到,OpenCV为Holistically-Nested Edge Detection提供了方便的框架,是进行边缘检测的高效方式之一。