如何在目标点连接这些线?图像是骨架化过程的结果。
我正在尝试使用分水岭变换将每一行分割为一个区域。
答案 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创建的工件,我建议再次提取骨架
注意间隙是如何闭合的,同时保持不同的水平线
如果您进一步将骨骼形态学操作应用于侵蚀图像,您可以得到以下结果:
连接曲线后,您不需要使用分水岭分割,而是使用连接的组件来标记每条曲线。
答案 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
此策略要求虚线中的间隙小于相邻线之间的距离。
如果线交叉,或者线条彼此太靠近,它将无法工作。但是我觉得它在你的例子中会很好用。
您还可以使用侵蚀功能删除第三行下方的工件。