部分洪水填充

问题描述 投票:3回答:3

我正在写一个基于voronoi的世界发电机,我在其中区分了山脉,湖泊,森林和海洋等地理特征。

每个功能都有一个id,因此可以识别和引用它。我使用泛洪填充算法来确定单元格属于哪些特征。

我已经意识到一些类似的情况,我想将一个功能分成多个较小的功能。最直接的例子是两条大森林连接的狭窄森林。实际上,它应该被视为两个森林,在狭窄的条带周围彼此分开,但我的填充算法只是直接通过并将所有东西标记为一个大森林的一部分。

我想最终将它们标记为“West 100 Acre Wood”和“East 100 Acre Wood”,让他们知道它们来自同一个连续的森林体。我查找了部分洪水填充逻辑,但由于我缺乏主题术语,我的搜索卡住了。

如果你想看到我正在使用的代码:https://github.com/olinkirkland/map

algorithm graph-theory theory geography flood-fill
3个回答
1
投票

找到连接区域后,您可以使用右侧规则(https://en.wikipedia.org/wiki/Maze_solving_algorithm#Wall_follower)跟踪内部。

要找到能够形成良好分裂点的单像素路径,您可以在此内部路径中查找两次访问过的像素(每个方向一次)。如果路径长度在分割的两侧足够长,则可以在该像素处将区域分割为两个,并且可以使用较小的区域再次尝试。

如果你想找到超过一个像素宽的分割点,或者确保两边的森林足够“强壮”,我建议采用基于像素的方法将其与其他方法结合起来:

  1. BFS删除距离边界小于w的像素。
  2. 查找每个剩余的连接区域。每个都将成为森林的“中心”。
  3. 检查每个中心,确保它的边缘距离边缘足够远,成为森林的中心。
  4. 将删除的像素添加回来,将它们连接到最近的中心。

4
投票

你通常会使用“形态开口”see Wikipedia definition,这是一种形态侵蚀,然后是扩张。如果你想象一个黑色背景上感兴趣的白色前景物体,侵蚀会侵蚀(在物体的边缘处啃掉)物体,并且膨胀会使边缘膨胀/变胖 - 从而去除小条带和狭窄的连接。

您可以使用Python中的Scikit-Image模块或Python或C ++中的OpenCV来完成。我选择在终端的命令行中使用ImageMagick进行操作,ImageMagick安装在大多数Linux发行版上,可用于macOS和Windows。

所以,使用这张地图图片:

enter image description here

我加载它,反转/否定它使森林变白,然后应用我提到的形态开口,然后将其反转并保存:

magick convert map.png -negate -morphology open disk:5 -negate result.png 

enter image description here


0
投票

您可以使用图像处理技术,该技术使用模糊处理并应用50%的阈值。这样,薄的连接和尖锐的尖峰减少并且特征通常变得更圆,而对象的整体尺寸不应该在一个特定方向上改变。这是重复应用过程的图像:

Separation of forests by blurring and applying a threshold

顶部图像代表您的原始情况,两个森林通过一条薄的走廊相连。该过程逐步删除走廊。

您可以在此过程中调整一些参数,例如: G。模糊半径和步数,因此您可以根据需要进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.