2025, Sep 25 21:31
Matplotlib में इमेज क्यों नहीं दिखती: imshow बनाम show() का सही उपयोग
Matplotlib में इमेज की जगह सिर्फ shape दिख रहा है? कारण समझें: नोटबुक में आखिरी अभिव्यक्ति, imshow बनाम show(), और सही लोडिंग. काम करने वाला उदाहरण और टिप्स. अभी पढ़ें
Matplotlib और किसी इमेज ऐरे के साथ काम करते समय अक्सर ऐसा होता है कि आउटपुट में केवल ऐरे का आकार (shape) दिखता है, जबकि खुद तस्वीर दिखाई ही नहीं देती। आम लक्षण: कंसोल पर (320, 240, 3) जैसा टपल छप जाता है, पर रेंडर हुई इमेज नहीं मिलती।
समस्या को दोहराने वाला न्यूनतम उदाहरण
नीचे दिया गया स्निपेट इमेज का आकार प्रिंट करता है और चित्र दिखाने की कोशिश करता है, लेकिन व्यवहार में अक्सर केवल वही टपल दिखता है:
import matplotlib.pyplot as gfx
print(photo_arr.shape)
gfx.imshow(photo_arr)
gfx.axis('off')
समस्या क्यों होती है
यहाँ दो बातें अहम हैं। पहला, चित्र दिखाने से पहले उसे सच में ऐरे में लोड होना चाहिए। दूसरा, रेंडरिंग का तरीका इस पर निर्भर करता है कि आप कोड कैसे चला रहे हैं। नोटबुक में वातावरण सेल की आखिरी अभिव्यक्ति का परिणाम अपने-आप दिखाता है। अगर आखिरी पंक्ति इमेज आउटपुट नहीं है, तो चित्र नजर नहीं आएगा, जबकि कोई भी स्पष्ट टेक्स्ट आउटपुट—जैसे print() से छपा shape—दिखता रहेगा। अगर आप gfx.imshow(photo_arr) को अंतिम स्टेटमेंट रखते हैं, तो इमेज दिखाई देती है। और अगर आपको 'आखिरी अभिव्यक्ति ही दिखती है' वाले व्यवहार पर निर्भर हुए बिना आकृति रेंडर करनी हो, तो gfx.show() कॉल करें। यही स्पष्ट कॉल सामान्य Python स्क्रिप्ट चलाते समय भी लागू होती है: टेक्स्ट के लिए print() और आकृतियाँ दिखाने के लिए gfx.show() का उपयोग करें।
काम करने वाला समाधान
पहले इमेज पढ़ें, फिर उसे दिखाएँ और जरूरत पड़े तो रेंडर को बाध्य करें:
import matplotlib.pyplot as gfx
import matplotlib.image as imgio
picture = imgio.imread('img.jpg')
print(picture.shape)
gfx.imshow(picture)
gfx.axis('off')
gfx.show()
यह बारीकी क्यों मायने रखती है
नोटबुक क्या अपने-आप दिखाता है और क्या चीज़ें स्पष्ट रूप से रेंडर करनी पड़ती हैं—यह फर्क समझना विज़ुअलाइज़ेशन कोड डिबग करते समय समय बचाता है। साथ ही, इंटरैक्टिव सत्रों और सामान्य स्क्रिप्ट्स के बीच व्यवहार एक जैसा रहता है। पहले डेटा लोड करना और यह नियंत्रित करना कि आकृतियाँ कब ड्रॉ हों, वर्कफ़्लो को अनुमान योग्य बनाता है और आउटपुट वहीं दिखता है जहाँ आप अपेक्षा करते हैं।
निष्कर्ष
चित्र दिखाने से पहले हमेशा उसे पढ़ें, और अगर आपको निष्कर्षात्मक (deterministic) व्यवहार चाहिए तो अप्रत्यक्ष रेंडरिंग पर भरोसा न करें। नोटबुक में या तो प्लॉटिंग कॉल को सेल की आखिरी पंक्ति बनाइए, या gfx.show() बुलाइए। स्क्रिप्ट्स में, आकृति दिखाने की गारंटी के लिए gfx.show() कॉल करें। इन आदतों के साथ, 'सिर्फ shape, इमेज नहीं' वाली हैरानी से बचेंगे और आपकी विज़ुअलाइज़ेशन पाइपलाइन सीधी-सादी रहेगी।
यह लेख StackOverflow के एक प्रश्न (पूछा गया Lucio Fernandez द्वारा) और Tchaivotsky के उत्तर पर आधारित है।