分离连接的线条和形状

时间:2014-01-21 11:58:46

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

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

enter image description here

这是我想要的结果

enter image description here

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

此致

2 个答案:

答案 0 :(得分:0)

分水岭将是一个问题,因为您已经证明它会产生原始线的多个分段。最初的分水岭由于它们的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]);

enter image description here

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

答案 1 :(得分:0)

应分离的轮廓部分基本上是与轮廓其余部分方向不同的部分。

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

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