2

我有一个二进制图像,我想检测不连续的线并将它们链接起来。 我什么都不知道(坐标,角度等)。 任何人都可以引导我如何开始?假设我有这样的形象:连接不连续的骨架形状和不连续的线

enter image description here

我想加入不连续的线。并且我想存储加入的行的信息(在一个数组中)以后使用。

+0

您可以从某种线条检测算法开始:http://www.ipol.im/pub/art/2012/gjmr-lsd/ 或Matlab的Hough-lines函数。 – GilLevi

回答

1

我发现你的问题很有趣,我会尝试给你一些想法,但不幸的是不是一个完整的算法(你知道,这需要时间...)。我也会给你留下一些没有答案的问题。

我认为您发布的图像是二进制图像,即黑色像素值为零,白色像素值为1。我忽略了红色像素,因为我认为您已经绘制了它们以突出显示您想要连接虚线的位置;忽略红色像素意味着我将它们的值设置为零。

首先我们需要一些定义。

非边界像素具有8邻居(西北,北,东北,东,东南,南,西南,西)像素:

abc 
h*d 
gfe 
上图中

该像素由*及其8个邻居a,b,c,d,e,f,gh指示。

我限定端点像素作为与一种的值与仅一个邻居之一值的像素,剩余邻居具有零的值,因此,例如此图显示的端点像素

000 
011 
000 

因为d=1和所有其余的邻居都是零。 下图显示了代替的像素这是不和端点像素,因为它有两个邻居等于一(a=1e=1

100 
010 
001 

现在我们可以开始描述一个简单的算法的一部分。

在第一步找到所有的端点像素,并把它们放在一个向量中:在下面的图像中,我标记了从1到15的端点(请注意,端点15在您发布的图像中未突出显示)。

enter image description here

在第二步中,为每个端点,发现其最接近的端点:例如考虑端点4,其最近的端点5.现在,如果你遵循一个连接端点的简单规则的最接近的端点,你将有连接4-5,10-11,13-14的段,这些都很好。但考虑1:其最接近的端点是2或可能是3,但我希望算法只是连接2和3,而将1连接到最左边的垂直线。我也想要6,9和12的相同的行为。

现在不同的情况:什么关于6,7和8?忽略8,最接近6的端点是7,但它们已经连接,我们如何管理这种情况?

最后,考虑15:为什么没有在你张贴的图片中突出显示它?也许它应该被忽略?

+1

感谢您的回复,推理您提出的建议很明确,但我认为他无法处理所有可能存在的案例。所以要回答你的问题案例15它将被忽略,我不知道我们如何能够处理这个案件1,6,9和12.我认为你的推理有所改进,我们如何能够管理所有案件 – Bertrand

0

可能会有所帮助。

  1. 增加线条的厚度,以在-至少2
  2. 查找连续前景像素的那些运行在其上一个或下一个列具有游程长度之内的所有背景像素的图像在垂直方向上。这将给出需要处理的点的位置。
  3. 对于每个点找到最近的陡峭点。这将是一个branch point或角度突然发生的一个点。 (先前答案的图像中的示例点15)。如果没有这个点,那显然是另一个end-point。称这些为reference point。端点和参考点之间的矢量将给出扩展的方向。
  4. 现在可以有多种方式来决定加入哪个点。你可以沿着这个方向取最近的前景点。您还可以根据KNN分类器中使用的端点和扩展点之间的角度和距离选择一些特征。

希望它有帮助。

+0

坦率地说我做不知道我该如何实现这一点,但非常感谢您的回复 – Bertrand

+0

例程检测分支点,终点在matlab中可用。删除分支点后获取参考点可能会更容易。 – Dib