在给定图像的情况下,表示和解决迷宫的最佳方法是什么?

给定一个JPEG图像(如上所示),读取它的最佳方法是什么,将其解析为一些数据结构并解决迷宫?我的第一直觉是逐像素地读取图像并将其存储在布尔值的列表(数组)中:True对于白色像素,False对于非白色像素(可以丢弃颜色).这种方法的问题是图像可能不是"像素完美".我只是说,如果墙上的某个地方有白色像素,可能会造成意想不到的路径.
另一种方法(经过深思熟虑后来找我)是将图像转换为SVG文件 - 这是在画布上绘制的路径列表.这样,路径可以被读入相同类型的列表(布尔值),其中True指示路径或墙,False指示可行进空间.如果转换不是100%准确,并且未完全连接所有墙壁,从而产生间隙,则会出现此方法的问题.
转换为SVG的另一个问题是线条不是"完美"直线.这导致路径是立方贝塞尔曲线.使用由整数索引的布尔值列表(数组),曲线不会轻易转移,并且必须计算曲线上所有的点,但不会与列表索引完全匹配.
我假设虽然这些方法中的一种可能有用(尽管可能不是),但鉴于这么大的图像,它们的效率非常低,并且存在更好的方法.如何最好(最有效和/或最简单)完成?有没有最好的方法?
然后是迷宫的解决方案.如果我使用前两种方法中的任何一种,我基本上会得到一个矩阵.根据这个答案,表示迷宫的好方法是使用树,解决它的好方法是使用A*算法.如何从图像中创建树?有任何想法吗?
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. …Run Code Online (Sandbox Code Playgroud) 我正在创建一个10,000到10,000张地图的游戏.
我希望用户能够设置位置并让计算机立即找到最佳路径.
然而,由于地图是10,000乘10,000,有100,000,000个节点,并且通过诸如A*或Dijkstra之类的传统方法找到该路径将需要大量存储器并且需要很长时间.
所以我的问题是:我怎样才能找到最好的路径?
我正在考虑的算法将世界划分为100个部分,每个部分有1,000,000个节点.然后将每个部分分成100个小节.这将重复进行,直到每个子部分包含100个节点.然后,算法将找到段的最佳路径,然后是子段,然后是子子段,直到找到最佳节点集.这会有效吗?还有更好的方法吗?
我也在考虑跳点搜索,但我不知道,只是发现它无法做到这一点并不痛苦.
编辑:我试图添加A*.但是,运行大约需要5秒钟,比理想时间长约4秒.
我目前正在使用Java制作一个迷宫解决游戏,目前我正陷入困境.我可以找到的所有随机迷宫生成算法以我无法弄清楚如何实现到当前代码的方式输出.我正在考虑使用Depth First Search,Recursive Backtracker或Prim的算法,因为我认为它们是最容易实现的,同时仍能产生良好的迷宫.那些与我当前程序一起使用的算法之一的工作用途是什么?这是我的游戏类:(随意指出任何不良做法,我对Java很新)
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Game extends JPanel implements ActionListener, KeyListener {
private boolean upPressed = false;
private boolean downPressed = false;
private boolean rightPressed = false;
private boolean leftPressed = false;
private final int playerDiam = 100;
private final int playerSpeed = 15;
private final int tileSize = 400;
private int[][] maze = {{1, 1, 1, 1, 1, 1},
{1, 2, 1, 1, 3, …Run Code Online (Sandbox Code Playgroud) 我一直在以多种不同的方式解决这个问题,经过一个月的尝试,我认为是时候用新的眼光来审视它了。我正在尝试制作一个图像缩放应用程序,用于重新调整 8 位精灵的大小并将它们转换为矢量图像。到目前为止,我所做的工作是这样的;它获取图像,将其分解为形状(具有相同颜色的相邻像素的区域),然后形状中的每个像素被四个像素替换:
\n\nprivate Point[] expand(int x, int y){\n x *= factor;\n y *= factor;\n return new Point[]{new Point(x+half_factor,y), new Point(x+factor,y+half_factor),\n new Point(x+half_factor, y+factor), new Point(x,y+half_factor)};\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这四个点中的每一个都被放入一个二维布尔数组中:
\n\nprivate void placePoint(int x, int y){\n table[x][y] = !table[x][y];\n extrema(x,y);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n单个形状的结果如下所示:
\n\n\n\n现在我想将所有这些点(减去内部的点)变成一个多边形,并且我尝试了许多不同的解决方案,最近我一直在尝试找到最近的邻居,直到它开始,但是每个算法我尝试失败。对于这个特定的示例,它到达右下角的 goomba,该 goomba 是颠倒的,并且在其左侧的像素簇中变得混乱。该程序认为路径已完成,并从那里创建一条到左上角的线,完全忽略左下象限中的点。
\n\n\n\n这就是我想要的样子:
\n\n\n\n以下是一些在我的情况下始终正确的事情,可能有助于找到有效的算法:
\n\n任何帮助都感激不尽!
\n\n更新:
\n\n我已经尝试了下面的所有解决方案和建议,并取得了一些进展,但仍然没有得到所需的输出。
\n\n原来的:
\n\n\n\n输出:
\n\n\n\n最终更新: …
我有很多像下面的图像(只有白色和黑色):
我最后的问题是找到匹配良好的椭圆.不幸的是,真正使用过的图像并不像这样.它们可能会变形一些,这使得椭圆匹配可能更难.
我的想法是找到"断点".我在下面的图片中标记它们:
也许这些点可以帮助匹配省略号.最终结果应该是这样的:
有人知道可以用什么算法来找到这些断点吗?或者甚至更好地进行良好的椭圆匹配?
非常感谢你
algorithm ×5
java ×2
path-finding ×2
a-star ×1
convex-hull ×1
ellipse ×1
image ×1
matlab ×1
maze ×1
python ×1