画像を与えられた迷路を表現して解決するための最良の方法は何ですか?
(上記のように)JPEG画像が与えられた場合、それを読み取り、データ構造に解析し、迷路を解決するための最良の方法は何ですか?私の最初の本能は、ピクセルごとに画像を読み取り、それをブール値のリスト(配列)に格納することです。True
白のピクセルとFalse
白以外のピクセル(色は破棄できます)の場合です。この方法の問題は、画像が「ピクセルパーフェクト」ではない可能性があることです。つまり、壁のどこかに白いピクセルがあると、意図しないパスが作成される可能性があるということです。
もう1つの方法(少し考えた後で思いついた)は、画像をSVGファイルに変換することです。これはキャンバスに描画されたパスのリストです。このようにして、パスを同じ種類のリスト(ブール値)に読み込むことができます。ここでTrue
、はパスまたは壁をFalse
示し、移動可能なスペースを示します。この方法の問題は、変換が100%正確でなく、すべての壁を完全に接続しておらず、ギャップが生じている場合に発生します。
また、SVGへの変換に関する問題は、線が「完全に」まっすぐではないことです。これにより、パスは3次ベジェ曲線になります。整数でインデックス付けされたブール値のリスト(配列)を使用すると、曲線は簡単に転送されず、曲線上に並ぶすべてのポイントを計算する必要がありますが、リストのインデックスと正確に一致するわけではありません。
これらの方法の1つは機能するかもしれませんが(おそらくそうではないかもしれませんが)、そのような大きな画像を考えると、それらはひどく非効率的であり、より良い方法が存在すると思います。これはどのように(最も効率的におよび/または最も複雑さを抑えて)行われるのですか?最善の方法さえありますか?
次に、迷路の解決が行われます。最初の2つの方法のいずれかを使用すると、基本的に行列になります。この答えによると、迷路を表現する良い方法は木を使用することであり、それを解決する良い方法はA*アルゴリズムを使用することです。画像からどのようにツリーを作成しますか?何か案は?
TL; DR
解析する最良の方法は?どのようなデータ構造に?構造はどのように解決を助け/妨げますか?
更新
@Thomas
が推奨するように、@ MikhailがPythonで記述したものを、を使用して実装しようとしましたnumpy
。アルゴリズムは正しいと思いますが、期待どおりに機能していません。(以下のコード。)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, [])