Reprezentowanie i rozwiązywanie labiryntu z obrazem

Jaki jest najlepszy sposób na przedstawienie i rozwiązanie labiryntu z obrazem?

Biorąc pod uwagę obraz JPEG (jak widać powyżej), jaki jest najlepszy sposób, aby go przeczytać, przeanalizować go w jakiejś strukturze danych i rozwiązać labirynt? Moim pierwszym instynktem jest odczytanie obrazu w pikselu po pikselu i zapisanie go w liście (tablicy) wartości logicznych:True dla białego piksela iFalse dla nie-białego piksela (kolory można odrzucić). Problem z tą metodą polega na tym, że obraz może nie być „doskonały pikselowo”. Po prostu mam na myśli, że jeśli gdzieś na ścianie znajduje się biały piksel, może stworzyć niezamierzoną ścieżkę.

Inną metodą (która przyszła mi do głowy po przemyśleniu) jest konwersja obrazu do pliku SVG - który jest listą ścieżek narysowanych na płótnie. W ten sposób ścieżki mogą być odczytywane na ten sam rodzaj listy (wartości logiczne) gdzieTrue wskazuje ścieżkę lub ścianę,False wskazanie przestrzeni do podróży. Problem z tą metodą pojawia się, jeśli konwersja nie jest w 100% dokładna i nie łączy w pełni wszystkich ścian, tworząc luki.

Również problem z konwersją do SVG polega na tym, że linie nie są „idealnie” proste. Powoduje to, że ścieżki są sześciennymi krzywymi Beziera. Z listą (tablicą) wartości logicznych indeksowanych liczbami całkowitymi krzywe nie byłyby łatwo przenoszone, a wszystkie punkty linii na krzywej musiałyby zostać obliczone, ale nie pasowałyby dokładnie do indeksów.

Zakładam, że chociaż jedna z tych metod może działać (choć prawdopodobnie nie), to są one żałośnie nieefektywne, biorąc pod uwagę tak duży obraz i że istnieje lepszy sposób. Jak to się robi najlepiej (najskuteczniej i / lub z najmniejszą złożonością)? Czy jest nawet najlepszy sposób?

Potem następuje rozwiązanie labiryntu. Jeśli użyję jednej z dwóch pierwszych metod, zasadniczo otrzymam macierz. Wedługta odpowiedź, dobrym sposobem na reprezentowanie labiryntu jest użycie drzewa, a dobrym sposobem na jego rozwiązanie jest użycieAlgorytm *. Jak stworzyć drzewo z obrazu? Jakieś pomysły?

TL; DR
Najlepszy sposób na analizowanie? Do jakiej struktury danych? Jak wspomniana struktura pomoże / przeszkodzi w rozwiązaniu?

AKTUALIZACJA
Próbowałem swoich sił w implementacji tego, co @Mikhail napisał w Pythonie, używającnumpy, as Zalecany @Thomas. Uważam, że algorytm jest poprawny, ale nie działa zgodnie z oczekiwaniami. (Kod poniżej.) Biblioteka PNG toPyPNG.

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, [])

questionAnswers(9)

yourAnswerToTheQuestion