【问题标题】:Joining discontinuous skeleton shapes and discontinuous lines连接不连续的骨架形状和不连续的线条
【发布时间】:2014-02-12 10:40:08
【问题描述】:

我有一个二进制图像,我想检测不连续的线条并将它们链接起来。 我什么都不知道(坐标、角度等)。 谁能指导我应该如何开始?假设我有这张图片:

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

【问题讨论】:

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


【解决方案1】:

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

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

首先我们需要一些定义。

一个非边界像素有 8 个相邻像素(西北、北、东北、东、东南、南、西南、西):

abc
h*d
gfe

在上图中,* 表示像素,a,b,c,d,e,f,gh 表示它的 8 个相邻像素。

我将端点像素定义为一个值为 1 的像素,只有一个值为 1 的邻居,其余邻居的值为 0,例如,此图显示了一个端点像素

000
011
000

因为d=1 和所有剩余的邻居都是零。 下图显示了一个不是端点像素的像素,因为它有两个等于一的邻居(a=1e=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。我认为改进您的推理以及我们如何管理所有案例
【解决方案2】:

这可能会有所帮助。

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

希望对你有帮助。

【讨论】:

  • 坦率地说,我不知道如何实现这一点,但非常感谢您的回复
  • 例程检测分支点,端点在matlab中可用。删除分支点后获取参考点可能会更容易。
猜你喜欢
  • 2019-07-04
  • 2019-11-04
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多