定义轮廓是否闭合

Vas*_*sev 7 java algorithm recursion image-processing shape

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

我正在放置一个图像,以便更好地显示问题.

在此输入图像描述

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

提前致谢.Vassil Kossev

Web*_*ter 8

第一个想法:使用合适的轮廓跟踪算法来获得有序轮廓.如果你的轮廓关闭,你最终会回到第一点.

第二个想法:使用洪水填充算法:如果你离开物体的边界框,它就会打开,否则就会关闭.

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


kol*_*kol 2

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

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

* 计算邻居很容易:使用原始图像!随机选择轮廓上的一个点,检查邻近的 8 个像素,并计算属于轮廓的部分。然后重复这些邻域检查,依此类推,直到检查完轮廓的所有像素。