दिए गए भूलभुलैया का प्रतिनिधित्व और हल करना किसी छवि को देखते हुए भूलभुलैया का प्रतिनिधित्व करने और हल करने का सबसे अच्छा तरीका क्या है?एक छवि
एक JPEG चित्र (जैसा कि ऊपर देखा) को देखते हुए, में इसे पढ़ने के लिए कुछ डेटा संरचना में यह पार्स और हल भूलभुलैया का सबसे अच्छा तरीका क्या है? एक गैर सफेद पिक्सेल के लिए एक सफेद पिक्सेल के लिए True
, और False
(रंग खारिज किया जा सकता है): मेरी पहली वृत्ति पिक्सेल द्वारा पिक्सेल में छवि पढ़ सकते हैं और बूलियन मूल्यों की एक सूची (सरणी) में संग्रहीत करना है। इस विधि के साथ समस्या यह है कि छवि "पिक्सेल सही" नहीं हो सकती है। इसके द्वारा मेरा मतलब यह है कि अगर दीवार पर कहीं एक सफेद पिक्सेल है तो यह एक अनजान पथ बना सकता है। जो एक कैनवास पर तैयार रास्तों की एक सूची है -
एक अन्य विधि (जो सोचा था की एक बिट के बाद मेरे पास आया) एक एसवीजी फ़ाइल करने के लिए छवि परिवर्तित करने के लिए है। इस तरह, पथों को उसी प्रकार की सूची (बूलियन मान) में पढ़ा जा सकता है जहां True
एक पथ या दीवार इंगित करता है, False
एक यात्रा-सक्षम स्थान का संकेत देता है। इस विधि के साथ एक मुद्दा उत्पन्न होता है यदि रूपांतरण 100% सटीक नहीं है, और अंतराल को पूरी तरह से कनेक्ट नहीं करता है, अंतराल बना देता है।
इसके अलावा एसवीजी में परिवर्तित करने के साथ एक समस्या यह है कि लाइनों "पूरी तरह से" सीधे नहीं हैं। इसके परिणामस्वरूप घन बेजियर वक्र होते हैं। पूर्णांक द्वारा अनुक्रमित बूलियन मानों की एक सूची (सरणी) के साथ, वक्र आसानी से स्थानांतरित नहीं होंगे, और वक्र पर मौजूद सभी बिंदुओं की गणना की जानी चाहिए, लेकिन सूची सूचकांक से बिल्कुल मेल नहीं खाएंगे।
मुझे लगता है कि जब तक इन तरीकों में से एक काम कर सकते हैं (हालांकि शायद नहीं) है कि वे इतनी बड़ी छवि को देखते हुए बुरी तरह अक्षम हैं, और एक बेहतर तरीका मौजूद है। यह सबसे अच्छा (सबसे कुशलतापूर्वक और/या कम से कम जटिलता के साथ) कैसे किया जाता है? क्या कोई सबसे अच्छा तरीका भी है?
फिर भूलभुलैया के हल आता है। अगर मैं पहले दो तरीकों में से किसी एक का उपयोग करता हूं, तो मैं अनिवार्य रूप से एक मैट्रिक्स के साथ समाप्त हो जाऊंगा। this answer के अनुसार, एक भूलभुलैया का प्रतिनिधित्व करने का एक अच्छा तरीका एक पेड़ का उपयोग कर रहा है, और इसे हल करने का एक अच्छा तरीका A* algorithm का उपयोग कर रहा है। छवि से पेड़ कैसे बनायेगा? कोई विचार?
टी एल; डॉ पार्स करने के लिए
सबसे अच्छा तरीका है? किस डेटा संरचना में? संरचना कैसे मदद/बाधा हल करने में कहा जाएगा?
अद्यतन
कार्यान्वयन के लिए मैं क्या @Mikhail पायथन में लिखा है, numpy
का उपयोग कर, के रूप में @Thomas सिफारिश पर मेरे हाथ की कोशिश की है। मुझे लगता है कि एल्गोरिदम सही है, लेकिन यह उम्मीद के रूप में काम नहीं कर रहा है। (नीचे कोड।) पीएनजी लाइब्रेरी 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, [])
मैं भूलभुलैया को काले और सफेद में बदल दूंगा और इसे हल करने के लिए सेलुलर ऑटोमाटा विधि ढूंढने के पथ का उपयोग करूंगा। –
क्या आपको केवल उस छवि के साथ सौदा करने की आवश्यकता है, या ऐसी कई छवियों के साथ? अर्थात। क्या इस निश्चित छवि के लिए कुछ मैन्युअल प्रोसेसिंग का विकल्प है? – Mikhail
@ मिखाइल बस यह छवि, मैनुअल प्रोसेसिंग एक विकल्प है। – Whymarrh