大家好。我真的很难弄清楚这一个的逻辑,并希望你可以帮助我。在我继续之前,我只是想让你知道我是业余程序员和初学者,没有任何正式的计算机科学培训,所以请耐心等待。 :D另外,我使用的是Python,但我可以使用Java或类似的东西。
Anywho,我希望实现一个Region Growing用于一个基本的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轴上回溯,直到它在其上方找到黑色像素。
这种进一步检查的方法有一些重大缺点。 当面对这样的形状时:
结果如下:
即使我告诉它在一段时间后开始扫地,中间腿仍然会被忽视。
http://en.wikipedia.org/wiki/8-connected_neighborhood
这种方法在我看来是最强大和最有效的,但在这一点上我无法完全弄明白,我也不能想到如何实现它而不会留下一些被忽视的区域
在每个细胞中,我会看到相邻的黑色细胞,设计一些方法来排列我应该首先访问哪一个,访问所有这些,并重复该过程,直到所有细胞都被覆盖。
我在这里看到的问题首先是处理完成此任务所必需的数据结构,并且只是弄清楚它背后的逻辑。
这些是我能够想到的最佳解决方案。 感谢您花时间阅读本文,我意识到它很长,但我认为我应该尽可能明确。任何和所有建议将不胜感激...谢谢!
我还研究了迷宫生成和求解算法,但不知道如何在这里实现。我对迷宫求解算法的理解是它们依赖于迷宫的通道具有相等的宽度。我当然可能错了。
答案 0 :(得分:5)
基本区域的增长,伪代码看起来像:
seed_point // starting point
visited // boolean array/matrix, same size as image
point_queue // empty queue
point_queue.enqueue( seed_point )
visited( seed_point ) = true
while( point_queue is not empty ) {
this_point = point_queue.dequeue()
for each neighbour of this_point {
if not visited( neighbour ) and neighbour is black/red/whatever
point_queue.enqueue( neighbour )
visited( neighbour ) = true
}
}
// we are done. the "visited" matrix tells
// us which pixels are in the region
我不明白你提到的排名在哪里。我错过了什么吗?
答案 1 :(得分:2)
我对这个很长的问题感到困惑。
您确定不只是尝试flood fill吗?
答案 2 :(得分:1)
一种简单的技术可以帮助一些迷宫解决问题,一只手放在墙上,可能会有所帮助。
但请注意,如果您选择了一个随机起点,您可能会选择一个点,无论您从那里出发,都会阻挡一部分。也就是说,如果你是以一小时玻璃形状开始的话,你只能填一半。
答案 3 :(得分:1)
这是一个关于编写递归迷宫求解器的非常精彩的小截屏视频:http://thinkcode.tv/catalog/amazing-python/
我认为它可能会为您解决的问题提供一些想法。
此外,这是我在观看截屏视频http://pastie.org/1854582后写的一个小的递归迷宫解决脚本。不需要相等宽度的通道,唯一需要的是开放空间,墙壁和某种结束条件,在这种情况下,找到迷宫的尽头。
如果你不想去递归,你可以做的另一件事是使用“回溯”方法。您可以在此页面上看到它在随机生成的迷宫中使用的一个小例子: http://weblog.jamisbuck.org/2011/2/7/maze-generation-algorithm-recap(页面上的第一个示例)。
这听起来有意义吗?如果是,请告诉我您是否希望我更详细地解释一下。
这似乎是关于在python http://www.daniweb.com/software-development/python/threads/148874
中进行洪水填充的非常好的讨论