【发布时间】:2011-08-16 14:44:24
【问题描述】:
大家好。我真的很难弄清楚这个逻辑,并希望你能帮助我。在我继续之前,我只想让你知道我是业余程序员和初学者,没有任何形式的正式计算机科学培训,所以请多多包涵。 :D 另外,我正在使用 Python,但我可以使用 Java 或类似的东西。
任何人,我都希望实现一个区域增长,以在基本的 Drawbot 中使用。 这是一篇关于区域增长的文章:http://en.wikipedia.org/wiki/Region_growing
按照我的设想,抽奖所依据的图像将满足以下条件:
-
在任意颜色深度下,图像的大小最多为 3x3 英寸
-
图像将是白色背景上的黑色连续形状
-
形状可以位于背景上的任何位置。
我已经考虑了以下解决此问题的方法。虽然有些工作在一定程度上,但每个人在性能或可行性方面都有一些相当大的缺陷(至少它们对我来说似乎不可行)。此外,因为这是一个 Drawbot,所以需要用一条连续的线来完成。但这并不意味着我不能回溯,它只是消除了多个起点(种子)的可能性。
考虑的方法:
随机游走:
用随机游走解决这个问题是我的第一直觉。我想,完成此任务的随机游走程序看起来像这样:
伪python...
Cells To Visit = Number of Black Cells
Cells Visited = 0
MarkColor = red
While Cells Visited < Cells To Visit:
if currentcell is black:
Mark Current Cell As Visited #change pixel to red
Cells Visited +=1
neighbors = Get_Adjacent_Cells() #returns cells either black or red
next cell = random.choose(neighbors)
currentCell = next cell
虽然我认为这是可行的,但在我看来效率极低且不能保证良好的结果,但为了实际完成某些事情,我可能最终会尝试这样做......我在伪代码中的逻辑甚至模糊地正确?
扫地模式:
对我来说,这种方法似乎是最容易实现的。我的想法是我可以在形状的一个极端选择一个起点(例如最左边的最低点)。从那里它会向右画,只在 x 轴上移动,直到它碰到一个白色像素。从这里它会在 y 轴上向上移动一个像素,然后在 x 轴上向左移动直到它到达一个白色像素。如果正上方的像素恰好是白色,则在 x 轴上回溯,直到找到其上方的黑色像素。
这种方法在进一步检查后有一些主要缺点。 当面对这样的形状时:
结果将如下所示:
即使我告诉它在一段时间后开始扫地,中腿仍然会被忽略。
4/8 连通社区:
http://en.wikipedia.org/wiki/8-connected_neighborhood
这种方法在我看来是最强大和最有效的,但在这一点上我无法完全弄清楚它,我也想不出我将如何实施它而不可能留下一些被忽视的区域
在每个单元格中,我都会查看相邻的黑色单元格,设计一些方法来排列我应该首先访问哪个单元格,访问所有单元格,然后重复该过程直到所有单元格都被覆盖。
我在这里看到的问题首先是处理完成此任务所需的数据结构,并且还只是弄清楚其背后的逻辑。
这些是我能想到的最佳解决方案。 感谢您花时间阅读本文,我知道它很长,但我认为我应该尽可能明确。任何和所有的建议都将不胜感激......谢谢!
编辑:
我还研究了迷宫生成和求解算法,但不确定如何在这里实现。我对迷宫求解算法的理解是,它们依赖于迷宫的通道宽度相等。我当然可能是错的。
【问题讨论】:
-
感谢分享。我现在正在研究它。我会让你知道/问你更多问题,这取决于我在哪里。 :P
-
如何填充 1 像素宽的 T 形?
标签: python algorithm image image-processing flood-fill