【问题标题】:Algorithm to Differentiate between water and land区分水陆的算法
【发布时间】:2012-04-10 05:06:34
【问题描述】:

我正在尝试提出一种算法来区分水和陆地。我有一个 2D 数组,它只包含 0(黑色方块)和 1(灰色方块),它产生了这个图像。我将其中一个水域涂成蓝色,这样你就可以看到应该是水的地方。水是大而圆形的区域。我将一些土地区域涂成绿色。所有的黑色直线都应该是陆地以及一些较小的圆形。

现在,所有的黑色区域都表示为 0,所有的灰色区域都表示为 1。所以在图片中,绿色和蓝色的点都表示为同一个东西。我需要将一些黑色区域(水)表示为 2。有什么好方法可以做到这一点?到目前为止,我想出的最好的办法是计算每个黑点的面积,并且只允许超过某个阈值的区域是水。我认为还有更好的方法,我想知道你们的想法。

【问题讨论】:

  • 第 1 步:将所有 0 设置为只有 0 的邻居作为水。第 2 步:将所有 0 设置为任何水作为水的邻居。
  • 或许你可以用这个Flood_fill algorithm作为起点。
  • 乔尔,我确实想到了你说的第一步,但没有想到第二步。唯一不好的是它也会将小区域变成水。(我填充的绿点,或者它左边的小3x3正方形)
  • 我将合并您建议的两个算法。我将在每个方向上标记被 3 个或更多 0 包围的 0,然后用洪水填充该区域。
  • 您可能应该首先为什么是土地和什么是水建立一个更确定的条件。说“区域很小”是非常非常武断的。例如,我无法判断蓝色区域最西边以南的黑色区域应该是陆地还是水域。

标签: java arrays algorithm terrain


【解决方案1】:

也许将面积与边缘的长度进行比较,这可以衡量圆度,因为完美的圆的面积与边缘的比率最高,而街道(我假设它们是街道)将有一个比例小。

也许这两个衡量标准也是阈值。

【讨论】:

  • 我通过结合前面的建议想出了一个解决方案,但我会记住这一点,因为它对我以后计划做的其他事情很有用。谢谢
【解决方案2】:

通过结合前两个建议,我能够找到解决方案。我首先寻找被任意数量的水瓦(即每个方向 4 个)包围的水瓦,然后使用洪水填充算法将整个水体设置为实际上是水。这是一张图片 结果。我还添加了一条海岸线以供外观。如您所见,较小的圆形物体仍然是陆地,这正是我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2018-09-18
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多