如何检测边缘并将该边缘表示为指定像素粗细的线?

How can I detect an edge and represent that edge as a line of specified pixel thickness?

我有一个 iOS 应用程序可以进行图像处理。图像是黑色背景,带有一个单一的纯白色主体,形状复杂。我可以使用 openCV 或 CIEdges 过滤器来获取边缘图像,如下所示。但该边缘的厚度是可变且未知的。有什么方法可以使边缘达到指定的厚度?例如 3 像素厚?

Edge found from solid body

您可以计算图像的骨架。骨架是一种用于 变薄 二进制区域的转换,以便保留其范围和连接性。在这种情况下,它将产生一个像素厚度的边缘。 skeletonize/thinning函数是OpenCV的扩展图像处理模块的一部分,在Python中(你没有提到什么实现您正在使用的 OpenCV):

# Imports:
import cv2
import numpy as np

# image path
path = "D://opencvImages//"
fileName = "contour.png"

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# Convert to grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Compute the skeleton:
skeleton = cv2.ximgproc.thinning(grayscaleImage, None, 1)

cv2.imshow("Skeleton", skeleton)
cv2.waitKey(0)

这个 gif 比较你的原始图像和它的骨架,你可以看到厚度减少了。图像已调整大小,因此您会看到一点混叠,post-processed 边缘看起来 non-constant,但骨架始终将曲线的厚度归一化为一个像素 (提示:在新选项卡中打开 gif 以查看 full-sized 动画):

如果你想要特定厚度的边缘,你可以dilate骨架几次。在C++中,使用扩展图像处理模块应该#include <opencv2/ximgproc.hpp>,函数原型为cv::ximgproc::thinning(InputArray src, OutputArray dst, int thinningType=THINNING_ZHANGSUEN)。更多信息 here.