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

问题描述:

如何使这些线连接到目标点?该图像是骨架化过程的结果。如何使用Python/Opencv连接二进制图像中的虚线

Resulting Image From Skeletonization

Points That I Need To Connect

我试图段每一行使用分水岭的区域。

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, iteraions=1) 

去除由dialte创建的工件/侵蚀,我建议以提取骨架再次

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

注意的差距是如何关闭,同时保持明显的水平线

而且侵蚀图像:
enter image description here

如果进一步应用骨架形态操作的侵蚀图像,你可以得到这样的结果:
enter image description here

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

+1

谢谢你,谢谢! –

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

如果你需要一个例子,你可以在这里找到它的文档中: 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

这种战略要求的是,在虚线的间隙比相邻线之间的距离小。

如果线条交叉或者线条彼此过于靠近,它将不起作用。不过,我认为在你的例子中它会很好地工作。

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

+0

你有多少时间进行计算? –

+0

谢谢,迈克! –