Bir görüntü verilen bir labirenti temsil etmenin ve çözmenin en iyi yolu nedir?
Bir JPEG görüntüsü verildiğinde (yukarıda görüldüğü gibi), onu okumanın, bazı veri yapısına ayrıştırmanın ve labirenti çözmenin en iyi yolu nedir? İlk içgüdüm görüntüyü piksel piksel okumak ve boole değerlerinin bir listesinde (dizi) saklamaktır: True
beyaz bir piksel için ve beyaz False
olmayan bir piksel için (renkler atılabilir). Bu yöntemin sorunu, görüntünün "piksel mükemmel" olmayabilir. Bununla demek istediğim, eğer bir duvarda bir yerde beyaz bir piksel varsa, istenmeyen bir yol oluşturabilir.
Başka bir yöntem (biraz düşünmeden sonra bana geldi), görüntüyü bir tuval üzerine çizilen yolların bir listesi olan bir SVG dosyasına dönüştürmektir. Bu şekilde, yollar aynı yol listesine (boole değerleri) okunabilir, burada True
bir yol veya duvarı gösterir, False
bu da seyahat edebilen bir alanı gösterir. Dönüşüm% 100 doğru değilse ve tüm duvarları tam olarak bağlamaz ve boşluklar oluşturuyorsa, bu yöntemle ilgili bir sorun ortaya çıkar.
Ayrıca SVG'ye dönüştürmeyle ilgili bir sorun, çizgilerin "mükemmel" düz olmamasıdır. Bu, yolların kübik bezier eğrileri olmasına neden olur. Tamsayılar tarafından endekslenen boole değerlerinin bir listesi (dizi) ile, eğriler kolayca aktarılmaz ve eğri üzerindeki çizginin tüm noktalarının hesaplanması gerekir, ancak liste indeksleriyle tam olarak eşleşmez.
Bu yöntemlerden birinin işe yarayabileceğini (muhtemelen olmasa da) böylesine büyük bir görüntü göz önüne alındığında acımasızca verimsiz olduklarını ve daha iyi bir yol olduğunu varsayıyorum. Bu en iyi nasıl (en verimli ve / veya en az karmaşıklıkla) yapılır? En iyi yol var mı?
Sonra labirent çözme geliyor. İlk iki yöntemden birini kullanırsam, aslında bir matrisle sonuçlanacağım. Bu cevaba göre , bir labirenti temsil etmenin iyi bir yolu bir ağaç kullanmaktır ve onu çözmek için iyi bir yol A * algoritması kullanmaktır . Resimden nasıl bir ağaç oluşturulur? Herhangi bir fikir?
TL; DR
Ayrıştırmanın en iyi yolu? Hangi veri yapısına? Söz konusu yapı çözüme nasıl yardımcı olur / engel olur?
GÜNCELLEME
@Mikhail'in Python'da yazdıklarını uygulamada @ numpy
Thomas'ın önerdiği gibi kullanarak elimi denedim. Algoritmanın doğru olduğunu hissediyorum, ancak umulduğu gibi çalışmıyor. (Aşağıdaki kod.) PNG kütüphanesi PyPNG'dir .
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)
bir altına taşınmalı for.if
ve onunla değiştirmelisiniz visited.append(np)
. Bir tepe noktası kuyruğa eklendiğinde ziyaret edilir. Aslında, bu dizi "sıraya alınmış" olarak adlandırılmalıdır. Bitişe ulaştıktan sonra BFS'yi de sonlandırabilirsiniz.