Bir görüntü verilen bir labirenti temsil etme ve çözme

| | | | | | | | | | | | | | | | | | | | | | | | |

Görüntü verilen bir labirenti temsil etmenin ve çözmenin en iyi yolu nedir?

The The Scope Issue 134'ün kapak resmi

Bir JPEG resmi (yukarıda görüldüğü gibi) verildiğinde, onu okumanın, bazı veri yapılarına ayırmanın ve labirenti çözmenin en iyi yolu nedir? içgüdü, görüntüyü piksel piksel okumak ve bir boole değerleri listesinde (dizi) depolamaktır: beyaz bir piksel için True ve beyaz olmayan bir piksel için False piksel (renkler atılabilir.) Bu yöntemle ilgili sorun, görüntünün "mükemmel piksel" olmamasıdır. Bununla sadece, duvarda bir yerde beyaz bir piksel varsa, istenmeyen bir yol oluşturabileceğini kastediyorum.

Başka bir yöntem (biraz düşündükten sonra aklıma geldi) görüntüyü bir tuval üzerine çizilen yolların bir listesi olan bir SVG dosyasına dönüştürmektir. True'un bir yolu veya duvarı gösterdiği aynı tür liste (boolean değerleri), False seyahat edilebilir bir alanı belirtir. Bu yöntemle ilgili bir sorun, dönüştürme %100 doğru değilse ve tüm duvarları tam olarak birbirine bağlayarak boşluklar oluşturmadığında ortaya çıkar.

SVG'ye dönüştürmeyle ilgili bir sorun da çizgilerin "mükemmel" olmamasıdır. " dümdüz. Bu, yolların kübik bezier eğrileri olmasına neden olur. Tamsayılar tarafından indekslenen bir boole değerleri listesi (dizisi) ile, eğriler kolayca transfer olmaz ve eğri üzerindeki tüm noktaların hesaplanması gerekir, ancak liste indeksleriyle tam olarak eşleşmez.

Bu yöntemlerden birinin işe yarayabileceğini (muhtemelen işe yaramasa da) bu kadar büyük bir görüntü göz önüne alındığında ne yazık ki verimsiz olduklarını ve daha iyi bir yol olduğunu varsayıyorum.Bu nasıl en iyisidir (en verimli ve/veya en az karmaşıklık ile) ) bitti mi? Hatta en iyi yol var mı?

Sonra labirentin çözümü geliyor. İlk iki yöntemden birini kullanırsam, aslında bir matris elde edeceğim. , @Thomas'ın önerdiği gibi. Algoritmanın doğru olduğunu hissediyorum, ancak umduğum gibi çalışmıyor. (Kod aşağıdadır.) PNG kitaplığı PyPNG'dir. p>

png'yi içe aktar, numpy, Kuyruk, operatör, itertools def is_white(koordinat, görüntü): """ (x, y)'nin yaklaşık beyaz bir piksel olup olmadığını döndürür.""" a = Şunun için True xrange(3)'te i: değilse a: break a = image[coord[1]][coord[0] * 3 + i] > 240 bir tanım döndür bfs(s, e, i, ziyaret edildi): """ Genişlik öncelikli arama gerçekleştirin. """ frontier = Queue.Queue() while s != e: for d in [(-1, 0 ), (0, -1), (1, 0), (0, 1)]: np = tuple(map(operator.add, s, d)) is_white(np, i) ve np ziyaret edilmemişse: frontier.put(np) ziyaret edildi.append(s) s = frontier.get() dönüş ziyaret edilen def main(): r = png.Reader(dosya adı = "thescope-134.png") satırlar, sütunlar, pikseller, meta = r.asDirect() assert meta["planes"] == 3 # dosyanın RGB olduğundan emin olun image2d = numpy.vstack(itertools.imap(numpy.uint8, piksel)) start, end = (402, 985), (398 , 27) bfs(start, end, image2d, []) yazdır