定义轮廓是否闭合

时间:2011-12-13 14:45:56

标签: java algorithm image-processing recursion shape

我需要一种方法来定义轮廓是表示线还是闭合形状。在Java中,我有一个对象 Shape ,它包含所有将它再次定义为单独对象的点。对象 Point 表示该点的坐标。我尝试用递归解析形状但是对于更大的形状,超过150点,性能非常差。我附上了我要解析的形状的图片,以帮助更好地理解这个问题。

我正在放置一张图片,以便更好地查看问题。

enter image description here

这只是展示了我得到的所有形状。我想只展示两个封闭的。

提前致谢。 Vassil Kossev

3 个答案:

答案 0 :(得分:8)

第一个想法:使用合适的contour tracing algorithm来获得有序轮廓。如果你的轮廓关闭,你最终会回到第一点。

第二个想法:使用flood filling algorithm:如果你离开对象的边界框,它就会打开,否则就会被关闭。

第三个想法:使用形态学。删除单个像素。查找所有端点和分支点。删除所有分支点。没有端点的连接组件是闭合轮廓(“圆圈”),具有两个端点的连接组件是开放轮廓(“线”)。将没有端点的连接组件重新投影到原始映像,并仅保留与它们具有共同部分的已连接组件。我认为这可以实时实施,也是最容易实现的。

答案 1 :(得分:2)

如果您有1像素宽的轮廓线,那么可以计算每个点的邻居数* 。如果给定轮廓的每个点都有2个邻居,那么轮廓关闭。如果有2个点,每个点只有1个邻居,则轮廓打开

如果轮廓较粗,则可以应用骨架化算法使其精确到1像素。一个有趣的例子是当轮廓上有侧枝时,但在这种情况下必须有3个邻居的分支点,因此可以轻松处理类似的情况。

*计算邻居很简单:使用原始图片!随机选择一个轮廓点,检查相邻的8个像素,并计算轮廓的一部分。然后对这些进行邻居检查,依此类推,直到检查完轮廓的所有像素为止。

答案 2 :(得分:1)

如果按顺序存储点,您可以比较第一个和最后一个点。如果它们在空间上相等,则轮廓闭合。