什么是最好的方式来表示和解决一个迷宫给定的图像?
给定一个JPEG图像(如上所示),什么是最好的方式读取它,解析成一些数据结构和解决迷宫?我的第一本能是逐像素地读取图像,并将其存储在布尔值的列表(数组)中:对于白色像素为True,对于非白色像素为False(颜色可以被丢弃)。这种方法的问题是,图像可能不是“像素完美”。我只是意味着,如果有一个白色的像素在墙上的某处,它可能会创建一个意想不到的路径。
另一种方法(经过一点思考后来到我)是将图像转换为SVG文件 – 这是在画布上绘制的路径列表。这样,路径可以读入相同类型的列表(布尔值),其中True表示路径或墙,False表示可行驶的空间。如果转换不是100%准确,并且没有完全连接所有的墙,产生空隙,则出现这种方法的问题。
此外,转换为SVG的一个问题是,线不是“完美”直。这导致路径是立方贝塞尔曲线。使用由整数索引的布尔值的列表(数组),曲线将不容易传递,并且必须计算曲线上的线的所有点,但不会精确地匹配列表索引。
我假设,虽然这些方法之一可能工作(虽然可能不),他们是严重低效给予如此大的形象,并有一个更好的方法。如何做到最好(最有效和/或最少的复杂性)?有没有一个最好的方法?
然后来解决迷宫。如果我使用前两种方法中的任一种,我将基本上以一个矩阵结束。根据this answer,一个很好的方式来表示一个迷宫是使用一棵树,一个好的办法来解决它是使用A* algorithm.如何从图像创建一棵树?有任何想法吗?
TL; DR
最好的解析方法?进入什么数据结构?所述结构将如何帮助/阻碍解决?
更新
我试过我的手实现@Mikhail用Python编写,使用numpy,作为@Thomas推荐。我觉得算法是正确的,但它不工作作为希望。 (下面的代码。)PNG库是PyPNG。
import png, numpy, Queue, operator, itertools
def is_white(coord, image):
""" Returns whether (x, y) is approx. a white pixel."""
a = True
for i in xrange(3):
if not a: break
a = image[coord[1]][coord[0] * 3 + i] > 240
return a
def bfs(s, e, i, visited):
""" Perform a breadth-first search. """
frontier = Queue.Queue()
while s != e:
for d in [(-1, 0), (0, -1), (1, 0), (0, 1)]:
np = tuple(map(operator.add, s, d))
if is_white(np, i) and np not in visited:
frontier.put(np)
visited.append(s)
s = frontier.get()
return visited
def main():
r = png.Reader(filename = "thescope-134.png")
rows, cols, pixels, meta = r.asDirect()
assert meta['planes'] == 3 # ensure the file is RGB
image2d = numpy.vstack(itertools.imap(numpy.uint8, pixels))
start, end = (402, 985), (398, 27)
print bfs(start, end, image2d, [])