连接不连续的骨架形状和不连续的线条

时间:2014-01-22 11:35:02

标签: matlab image-processing computer-vision shape pattern-recognition

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

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

首先,我们需要一些定义。

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

abc
h*d
gfe

在上图中,像素由*表示,其8邻居由a,b,c,d,e,f,gh表示。

我将端点像素定义为值为1且仅为一个值为1的邻居,其余邻居的值为零,因此例如此图显示端点像素< / p>

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 :(得分:0)

可能会有所帮助。

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