python 迷宫边界_python – 表示和解决给定图像的迷宫

本文探讨了如何处理给定JPEG图像的迷宫问题,包括通过逐像素读取和转换为SVG来表示迷宫,以及使用A*算法解决迷宫。作者尝试用Python结合numpy库实现BFS算法,但遇到问题。寻求最佳解析方法、数据结构及解决方案。
摘要由CSDN通过智能技术生成

什么是最好的方式来表示和解决一个迷宫给定的图像?

给定一个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, [])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值