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