如何使用Python/Opencv连接二进制图像中的虚线
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创建的工件/侵蚀,我建议以提取骨架再次
注意的差距是如何关闭,同时保持明显的水平线
如果进一步应用骨架形态操作的侵蚀图像,你可以得到这样的结果:
一旦连接曲线你不需要使用分水岭分割,而是使用连接的组件来标记每条曲线。
由于图像已经是单色的,因此可以使用形态转换来关闭折线。
如果你需要一个例子,你可以在这里找到它的文档中: 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
这种战略要求的是,在虚线的间隙比相邻线之间的距离小。
如果线条交叉或者线条彼此过于靠近,它将不起作用。不过,我认为在你的例子中它会很好地工作。
您还可以使用侵蚀功能删除第三行下面的工件。
你有多少时间进行计算? –
谢谢,迈克! –
谢谢你,谢谢! –