如何使用Python / Opencv连接二进制图像中的虚线

问题描述 投票:8回答:2

如何在目标点连接这些线?图像是骨架化过程的结果。

我正在尝试使用分水岭变换将每一行分割为一个区域。

python opencv image-processing image-segmentation edge-detection
2个回答
11
投票

MikeE的答案非常好:使用扩张和侵蚀形态学操作可以在这种情况下提供很多帮助。 我想建议稍微改进一下,利用手头图像的特定结构。我建议使用水平内核来连接水平线的端点,而不是将相邻线连接到彼此,而不是使用通用内核的扩张/侵蚀。

这是代码草图(假设输入图像存储在bw numpy 2D数组中):

import cv2, numpy as np

kernel = np.ones((1,20), np.uint8)  # note this is a horizontal kernel
d_im = cv2.dilate(bw, kernel, iterations=1)
e_im = cv2.erode(d_im, kernel, iterations=1) 

你得到的是扩张的图像: enter image description here

注意间隙是如何闭合的,同时保持不同的水平线

和被侵蚀的图像: enter image description here

为了删除由扩张/侵蚀创建的工件,我建议再次提取骨架。 如果您进一步将骨架形态学操作应用于侵蚀图像,您可以得到以下结果: enter image description here

连接曲线后,您不需要使用分水岭分割,而是使用连接的组件标记每条曲线。


4
投票

由于图像已经是单色的,因此您可以使用形态变换来关闭折线。

如果您需要一个示例,可以在此处的文档中找到它:http://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html#closing

它的工作原理是首先扩大图像中的白色区域,然后再蚀刻相同的量。有效关闭白色区域的任何孔。更多细节和示例可以在这里找到:http://docs.opencv.org/2.4/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

该策略要求虚线中的间隙小于相邻线之间的距离。

如果线交叉,或者线条彼此太靠近,它将无法工作。但是我觉得它在你的例子中会很好用。

您还可以使用侵蚀功能删除第三行下方的工件。

© www.soinside.com 2019 - 2024. All rights reserved.