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