Thi*_*nde 8 python opencv image-processing edge-detection image-segmentation
如何在目标点连接这些线?图像是骨架化过程的结果.


我正在尝试使用分水岭变换将每一行分割为一个区域.
Sha*_*hai 11
MikeE的答案非常好:使用扩张和侵蚀形态学操作可以在这种情况下提供很多帮助.
我想建议稍微改进一下,利用手头图像的特定结构.我建议使用水平内核来连接水平线的端点,而不是将相邻线连接到彼此,而不是使用通用内核的扩张/侵蚀.
这是代码草图(假设输入图像存储在bwnumpy 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)
Run Code Online (Sandbox Code Playgroud)
要删除由dialte/erode创建的工件,我建议再次提取骨架
注意间隙是如何闭合的,同时保持不同的水平线
如果您进一步将骨架形态学操作应用于侵蚀图像,您可以得到以下结果:

连接曲线后,您不需要使用分水岭分割,而是使用连接的组件标记每条曲线.
小智 5
由于图像已经是单色的,因此您可以使用形态变换来闭合虚线。
如果您需要示例,可以在此处的文档中找到它: http ://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_looking_hats/opening_looking_hats.html#looking
它的工作原理是首先扩大图像中的白色区域,然后侵蚀相同的量。有效封闭白色区域中的任何孔洞。更多细节和示例可以在这里找到: http://docs.opencv.org/2.4/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html
该策略要求折线中的间隙小于相邻线之间的距离。
如果线交叉或线彼此太靠近,则它将不起作用。不过我认为它在你的例子中会很好地工作。
您还可以使用 erode 函数删除第三行以下的伪影。