【问题标题】:Separate the connected lines and shapes分离连接的线条和形状
【发布时间】:2014-02-11 00:14:48
【问题描述】:

我想要一种分离连接线的方法和方法。这是我的图片

这是我想要的结果

我该如何解决这个问题?提前谢谢!

真诚的

【问题讨论】:

标签: matlab shape image-recognition overlapping image-segmentation


【解决方案1】:

分水岭将是一个问题,因为您已经证明它会产生原始线的多个分段。最初,由于它们的convex shapes,分水岭适用于谷物,而这里在线条的情况下没有全局凸形来导致良好的碎片,最好使用具有一些限制的分水岭。

最好尝试解决问题的更简单版本。想象一下,只有水平线和垂直线是可能的。因此,在这种情况下,这意味着通过切割短垂直线(通过投影 x-y 梯度测量长度)来分离水平长线。基本提示是使用这些线的梯度/斜率来帮助决定在哪里切割 - 正交线。在更一般的情况下,问题需要local curvaturegeodesic distance 的度量。

一个更简单的解决方案(正在编辑)只是删除您拥有的骨架中的连接点。 这会导致你的一些水平连接的线被分割,但我想这可以通过一些端点过滤来解决。一个简单的尝试:

 J = imread('input.png');
 B = bwmorph(J,'branchpoints');
 L = bwlabel((J>0).*(~B),8); %removing the branch points from the skeleton
 Label = label2rgb(bwlabel((J>0).*(~B),8),'jet',[0 0 0]);

最终标记的线组件。这需要进一步的端点预过滤,基于方向的过滤。

【讨论】:

  • 感谢您的回复,我已经尝试过了,但我可以检测到所有分支点,我调用 bwmorph 来获取分支点。然后删除。然后获取线段的端点并计算角度。检测任何在(pi/4 和 3pi/4)之间比水平更垂直的段。这是获得的结果。但是尽管我可以检测到所有分支点,并且我可以检测到所有连接线,但这里得到的结果是oi58.tinypic.com/2463os9.jpg
  • 我想最好使用线段之间的相对角度,而不是直接使用线段所对的绝对角度。这可能会提供更多的稳健性。
【解决方案2】:

轮廓中应该分开的部分基本上是与轮廓的其余部分不在同一方向的部分。

我只能在没有特定代码或功能的情况下给你一个基本的方法,我怀疑它是最有效的,但由于这里没有太多答案......这也是使用问题的知识和解决方案...

  1. 找到连接的轮廓及其所有分支作为一组像素坐标(将线条表示为单个像素宽的轮廓)
  2. 将轮廓列表转换为每个相邻像素坐标之间的一组角度
  3. 可选:使用平均滤波器滤除高频分量
  4. 对角度进行直方图以找出大多数等高线所在的角度(称为公共角度)
  5. 搜索轮廓,查找从 +/- 常见角度(公差为 +/-30 度)到该负值(-/+ 具有相似公差的常见角度)的部分。
  6. 对于每个部分,删除与上述两个阈值之间的角度相关联的像素(即共同角度 + 30 度到 -共同角度 - 30 度。
  7. 对每个连接的轮廓重复

希望对大家有所帮助

【讨论】:

    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    相关资源
    最近更新 更多