Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python/Opencv连接二进制图像中的虚线_Python_Opencv_Image Processing_Image Segmentation_Edge Detection - Fatal编程技术网

如何使用Python/Opencv连接二进制图像中的虚线

如何使用Python/Opencv连接二进制图像中的虚线,python,opencv,image-processing,image-segmentation,edge-detection,Python,Opencv,Image Processing,Image Segmentation,Edge Detection,如何使这些线在目标点处连接?该图像是骨骼化过程的结果 我尝试使用分水岭变换将每条线分割为一个区域。由于图像已经是单色的,您可以使用形态学变换来闭合虚线 如果您需要示例,可以在以下文档中找到: 它的工作原理是先扩大图像中的白色区域,然后再以同样的量腐蚀回来。有效地封闭白色区域中的所有孔洞。 更多详细信息和示例可在此处找到: 此策略要求折线中的间距小于相邻线之间的距离 如果两条线交叉,或者两条线之间的距离太近,这将不起作用。不过,我认为在您的示例中,它将非常有效 您还可以使用腐蚀功能删除第三

如何使这些线在目标点处连接?该图像是骨骼化过程的结果


我尝试使用分水岭变换将每条线分割为一个区域。

由于图像已经是单色的,您可以使用形态学变换来闭合虚线

如果您需要示例,可以在以下文档中找到:

它的工作原理是先扩大图像中的白色区域,然后再以同样的量腐蚀回来。有效地封闭白色区域中的所有孔洞。 更多详细信息和示例可在此处找到:

此策略要求折线中的间距小于相邻线之间的距离

如果两条线交叉,或者两条线之间的距离太近,这将不起作用。不过,我认为在您的示例中,它将非常有效

您还可以使用腐蚀功能删除第三行下方的瑕疵。

的答案非常好:在这种情况下,使用膨胀和腐蚀形态学操作可以帮助很大。
我想建议一些改进,充分利用手头图像的具体结构。我建议使用水平内核来连接水平线的端点,但不会将相邻的线彼此连接,而不是对普通内核使用膨胀/侵蚀

下面是代码的草图(假设输入图像存储在
bw
numpy2d数组中):

得到的是放大的图像:

注意间隙是如何闭合的,同时保持不同的水平线

被侵蚀的图像:

要移除扩张/侵蚀产生的瑕疵,我建议再次提取骨架。
如果进一步对腐蚀图像应用骨架形态学操作,可以得到以下结果:


一旦将曲线连接起来,就不需要使用分水岭分割,而是使用连接的组件来标记每条曲线。

我正在研究类似的问题,但它更复杂,在某些点,直线非常接近,因此形态变换最终会合并它们。如果有人知道任何其他方式,请建议。提前谢谢


来谈谈你的问题。我想你甚至不需要做形态学手术。由于您已经对图像进行了骨架化,您可以简单地设计一个内核来检测线打断的点,并使用距离和坡度(导数)作为标准连接这些点。我不知道它是否能100%工作,但您可以试一试。

您有多少时间进行计算?非常感谢您,Shai!
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)