我有一个二进制图像,我想检测不连续的线并将它们链接起来。 我什么都不知道(坐标,角度等)。 任何人都可以引导我如何开始?假设我有这样的形象:连接不连续的骨架形状和不连续的线
我想加入不连续的线。并且我想存储加入的行的信息(在一个数组中)以后使用。
我有一个二进制图像,我想检测不连续的线并将它们链接起来。 我什么都不知道(坐标,角度等)。 任何人都可以引导我如何开始?假设我有这样的形象:连接不连续的骨架形状和不连续的线
我想加入不连续的线。并且我想存储加入的行的信息(在一个数组中)以后使用。
我发现你的问题很有趣,我会尝试给你一些想法,但不幸的是不是一个完整的算法(你知道,这需要时间...)。我也会给你留下一些没有答案的问题。
我认为您发布的图像是二进制图像,即黑色像素值为零,白色像素值为1。我忽略了红色像素,因为我认为您已经绘制了它们以突出显示您想要连接虚线的位置;忽略红色像素意味着我将它们的值设置为零。
首先我们需要一些定义。
非边界像素具有8邻居(西北,北,东北,东,东南,南,西南,西)像素:
abc
h*d
gfe
上图中
该像素由*
及其8个邻居a,b,c,d,e,f,g
和h
指示。
我限定端点像素作为与一种的值与仅一个邻居之一值的像素,剩余邻居具有零的值,因此,例如此图显示的端点像素
000
011
000
因为d=1
和所有其余的邻居都是零。 下图显示了代替的像素这是不和端点像素,因为它有两个邻居等于一(a=1
和e=1
)
100
010
001
现在我们可以开始描述一个简单的算法的一部分。
在第一步找到所有的端点像素,并把它们放在一个向量中:在下面的图像中,我标记了从1到15的端点(请注意,端点15在您发布的图像中未突出显示)。
在第二步中,为每个端点,发现其最接近的端点:例如考虑端点4,其最近的端点5.现在,如果你遵循一个连接端点的简单规则的最接近的端点,你将有连接4-5,10-11,13-14的段,这些都很好。但考虑1:其最接近的端点是2或可能是3,但我希望算法只是连接2和3,而将1连接到最左边的垂直线。我也想要6,9和12的相同的行为。
现在不同的情况:什么关于6,7和8?忽略8,最接近6的端点是7,但它们已经连接,我们如何管理这种情况?
最后,考虑15:为什么没有在你张贴的图片中突出显示它?也许它应该被忽略?
感谢您的回复,推理您提出的建议很明确,但我认为他无法处理所有可能存在的案例。所以要回答你的问题案例15它将被忽略,我不知道我们如何能够处理这个案件1,6,9和12.我认为你的推理有所改进,我们如何能够管理所有案件 – Bertrand
可能会有所帮助。
end-point
。称这些为reference point
。端点和参考点之间的矢量将给出扩展的方向。希望它有帮助。
您可以从某种线条检测算法开始:http://www.ipol.im/pub/art/2012/gjmr-lsd/ 或Matlab的Hough-lines函数。 – GilLevi