एक छवि दी गई भूलभुलैया का प्रतिनिधित्व करना और हल करना

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

किसी चित्र में दी गई भूलभुलैया को दर्शाने और हल करने का सबसे अच्छा तरीका क्या है?

The स्कोप इश्यू की कवर इमेज 134

जेपीईजी इमेज को देखते हुए (जैसा कि ऊपर देखा गया है), इसे पढ़ने का सबसे अच्छा तरीका क्या है, इसे कुछ डेटा स्ट्रक्चर में पार्स करें और भूलभुलैया को हल करें? मेरा पहला वृत्ति पिक्सेल द्वारा पिक्सेल में छवि को पढ़ना और इसे बूलियन मानों की एक सूची (सरणी) में संग्रहीत करना है: एक सफेद पिक्सेल के लिए सही, और एक गैर-सफेद के लिए गलत पिक्सेल (रंगों को त्यागा जा सकता है)। इस पद्धति के साथ समस्या यह है कि छवि "पिक्सेल परिपूर्ण" नहीं हो सकती है। इससे मेरा सीधा सा मतलब है कि अगर दीवार पर कहीं सफेद पिक्सेल है तो यह एक अनपेक्षित पथ बना सकता है।

एक और तरीका है (जो कुछ विचार के बाद मेरे पास आया) छवि को एक एसवीजी फ़ाइल में परिवर्तित करना है - जो एक कैनवास पर खींचे गए पथों की एक सूची है। इस तरह, पथों को पढ़ा जा सकता है उसी प्रकार की सूची (बूलियन मान) जहां True पथ या दीवार को इंगित करता है, गलत एक यात्रा-सक्षम स्थान का संकेत। इस पद्धति के साथ एक समस्या उत्पन्न होती है यदि रूपांतरण 100% सटीक नहीं है, और सभी दीवारों को पूरी तरह से नहीं जोड़ता है, जिससे अंतराल पैदा होता है।

एसवीजी में कनवर्ट करने के साथ एक समस्या यह भी है कि लाइनें "पूरी तरह से" नहीं हैं " सीधा। इसके परिणामस्वरूप पथ घन बेजियर वक्र होते हैं। पूर्णांकों द्वारा अनुक्रमित बूलियन मानों की एक सूची (सरणी) के साथ, वक्र आसानी से स्थानांतरित नहीं होंगे, और वक्र पर रेखा के सभी बिंदुओं की गणना करनी होगी, लेकिन सूची सूचकांकों से बिल्कुल मेल नहीं खाएंगे।

< पी>मुझे लगता है कि इन तरीकों में से एक काम कर सकता है (हालांकि शायद नहीं) कि इतनी बड़ी छवि को देखते हुए वे बेहद अक्षम हैं, और यह कि एक बेहतर तरीका मौजूद है। यह सबसे अच्छा कैसे है (सबसे कुशलता से और/या कम से कम जटिलता के साथ) ) किया? क्या कोई सबसे अच्छा तरीका भी है?

फिर भूलभुलैया का समाधान आता है। अगर मैं पहले दो तरीकों में से किसी एक का उपयोग करता हूं, तो मैं अनिवार्य रूप से एक मैट्रिक्स के साथ समाप्त हो जाऊंगा। यह उत्तर, एक भूलभुलैया का प्रतिनिधित्व करने का एक अच्छा तरीका एक पेड़ का उपयोग करना है, और इसे हल करने का एक अच्छा तरीका A* एल्गोरिथम। कोई छवि से एक पेड़ कैसे बनाएगा? कोई विचार?

TL;DR
पार्स करने का सबसे अच्छा तरीका क्या है? टा संरचना? कैसे कहा जाएगा कि संरचना मदद/समाधान में बाधा डालती है?

अपडेट करें
मैंने numpy, जैसा कि @ थॉमस ने सिफारिश की थी। मुझे लगता है कि एल्गोरिदम सही है, लेकिन यह उम्मीद के मुताबिक काम नहीं कर रहा है। (नीचे कोड।) पीएनजी लाइब्रेरी PyPNG है। p>

आयात png, numpy, Queue, operator, itertools def is_white(coord, image): """ रिटर्न करता है कि क्या (x, y) लगभग एक सफेद पिक्सेल है। i in xrange(3): if not a: break a = image[coord[1]][coord[0] *3 + i] > 240 एक डीईएफ़ बीएफएस (एस, ई, आई, विज़िट किया गया) लौटाएं: """ चौड़ाई-पहली खोज करें। """ फ्रंटियर = कतार। कतार() जबकि एस! = ई: डी के लिए [(-1, 0 ), (0, -1), (1, 0), (0, 1)]: np = tuple(map(operator.add, s, d)) यदि is_white(np, i) और np विज़िट नहीं किया गया है: Frontier.put(np) visit.append(s) s = frontier.get() वापसी देखी गई def main(): r = png.Reader(filename = "thescope-134.png") पंक्तियाँ, cols, पिक्सेल, मेटा = r.asDirect() मुखर मेटा["विमानों"] == 3 # सुनिश्चित करें कि फ़ाइल RGB image2d = numpy.vstack(itertools.imap(numpy.uint8, pixel)) प्रारंभ, अंत = (402, 985), (398) है , 27) प्रिंट bfs (प्रारंभ, अंत, image2d, [])