如何使用 Python/Opencv 连接二进制图像中的虚线
How to connect broken lines in a binary image using Python/Opencv
如何让这些线在目标点连接起来?该图像是骨架化过程的结果。
我正在尝试使用分水岭变换将每条线分割为一个区域。
由于图像已经是单色的,您可以使用形态学变换来闭合虚线。
如果您需要示例,可以在此处的文档中找到它:
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
此策略要求虚线中的间隙小于相邻线之间的距离。
如果线条交叉,或者线条彼此太靠近,它将不起作用。但是我认为它在您的示例中会很好地工作。
您还可以使用侵蚀功能去除第三行以下的瑕疵。
的回答很好:使用膨胀和腐蚀形态学操作在这方面有很大帮助。
我想提出一点改进建议,利用手头图像的特定结构。我建议使用 水平内核 ,而不是将 dilation/erosion 与通用内核一起使用,它将连接水平线的端点,但不会将相邻的线彼此连接。
这是一个代码草图(假设输入图像存储在 bw
numpy 二维数组中):
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)
你得到的是放大后的图像:
注意间隙是如何闭合的,同时保持明显的水平线
以及被腐蚀的图像:
要删除 dilate/erode 创建的工件,我建议再次提取骨架。
如果对腐蚀后的图像进一步进行骨架形态学操作,可以得到这样的结果:
连接曲线后,您不需要使用分水岭分割,而是使用连接的组件来标记每条曲线。
我正在处理类似的问题,但它更复杂,并且在某些地方线条非常接近,因此形态转换最终会合并它们。如果有人知道任何其他方式,请提出建议。提前致谢!
来解决你的问题。我认为你甚至不需要形态学操作。由于您已经对图像进行了骨架化,因此您可以简单地设计一个内核来检测线断开的点,并使用距离和斜率(导数)作为标准连接这些点。我不知道它是否会 100% 工作,但你可以试一试。
如何让这些线在目标点连接起来?该图像是骨架化过程的结果。
我正在尝试使用分水岭变换将每条线分割为一个区域。
由于图像已经是单色的,您可以使用形态学变换来闭合虚线。
如果您需要示例,可以在此处的文档中找到它: 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
此策略要求虚线中的间隙小于相邻线之间的距离。
如果线条交叉,或者线条彼此太靠近,它将不起作用。但是我认为它在您的示例中会很好地工作。
您还可以使用侵蚀功能去除第三行以下的瑕疵。
我想提出一点改进建议,利用手头图像的特定结构。我建议使用 水平内核 ,而不是将 dilation/erosion 与通用内核一起使用,它将连接水平线的端点,但不会将相邻的线彼此连接。
这是一个代码草图(假设输入图像存储在 bw
numpy 二维数组中):
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)
你得到的是放大后的图像:
注意间隙是如何闭合的,同时保持明显的水平线
以及被腐蚀的图像:
要删除 dilate/erode 创建的工件,我建议再次提取骨架。
如果对腐蚀后的图像进一步进行骨架形态学操作,可以得到这样的结果:
连接曲线后,您不需要使用分水岭分割,而是使用连接的组件来标记每条曲线。
我正在处理类似的问题,但它更复杂,并且在某些地方线条非常接近,因此形态转换最终会合并它们。如果有人知道任何其他方式,请提出建议。提前致谢!
来解决你的问题。我认为你甚至不需要形态学操作。由于您已经对图像进行了骨架化,因此您可以简单地设计一个内核来检测线断开的点,并使用距离和斜率(导数)作为标准连接这些点。我不知道它是否会 100% 工作,但你可以试一试。