【问题标题】:Define if a contour is closed or not定义轮廓是否闭合
【发布时间】:2011-12-14 06:03:12
【问题描述】:

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

我正在放一张图片以便更好地可视化问题。

这只是显示我得到的所有形状。我只想显示两个已关闭的。

提前致谢。 瓦西尔·科塞夫

【问题讨论】:

  • 我想你想用“算法”标记这个问题?
  • 谢谢。我知道我忘记了什么。
  • 这些点是缠绕成一个环还是只是以任意顺序列出?
  • 您是否也必须将封闭轮廓与开放轮廓分开?或者你有一个算法来分离它们,只是想确定给定的轮廓是封闭的还是开放的?
  • 我想确定图片中的给定轮廓是封闭的还是开放的。如果它是关闭的,我会显示它,如果它是打开的,我不在乎它。

标签: java algorithm image-processing recursion shape


【解决方案1】:

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

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

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

【讨论】:

  • 第四个想法(因为我不确定它是否有效而被删除):选择一个肯定在你的物体内部的点(例如凸物体的质点)并以合理的角度绘制径向线小步骤。如果对象的轮廓和线条的交点数总是奇数 - 你有一个闭合的轮廓。否则你的对象是打开的。
【解决方案2】:

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

如果您的轮廓较粗,那么您可以应用 骨架化 算法使它们恰好薄 1 个像素。一个有趣的情况是,当轮廓上有侧枝,但在这种情况下,必须有具有 3 个邻居的分支点,因此可以轻松处理类似的情况。

* 计算邻居数 很简单:使用原始图像!随机选择轮廓的一个点,检查相邻的 8 个像素,计算属于轮廓的那些点。然后对这些重复邻居检查,依此类推,直到检查完轮廓的所有像素。

【讨论】:

  • 不幸的是,根据您计算邻居的方式,您可以有多个只有一个邻居的点并且仍然具有闭合轮廓,因此您建议的第一种方法可能会产生假阴性。
  • 这正是我写关于骨架化和处理侧枝的原因。几年前,我在一个程序中应用了这种方法,该程序提取了扫描图形(科学文章的图形)的点坐标。我有弯曲的、嘈杂的粗线,所以我必须先让它们平滑一点。然后我应用了我的骨架化算法,之后,我删除了侧枝。我不仅处理了图形线,还处理了图形的轴,因此作为最后一步,程序可以校准图形线的点,并将它们保存以直接在 Matlab 和 Excel 中使用:)
  • 非常感谢这个想法。我决定使用这个,因为它是最简单、最直接的,这正是我所需要的。
【解决方案3】:

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

【讨论】:

  • 不幸的是,这些点没有排序。但是,如果有办法对它们进行排序,那将很有用。坐标排序的标准是什么?
  • 您希望将坐标排序成一个环。 WebMonster 提供了几个轮廓跟踪算法的链接 - 其中一个可以很好地工作。
猜你喜欢
  • 2011-10-03
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2015-06-04
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多