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

时间:2017-05-09 01:48:33

标签: python opencv image-processing image-segmentation edge-detection

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

Resulting Image From Skeletonization

Points That I Need To Connect

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

2 个答案:

答案 0 :(得分:9)

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) 

删除dialte / erode创建的工件,我建议再次提取骨架

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

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

被侵蚀的图像:
enter image description here

如果您进一步将骨骼形态学操作应用于侵蚀图像,您可以得到以下结果:
enter image description here

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

答案 1 :(得分: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

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

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

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