2010-01-21 7 views
12

का उपयोग करके बहुत बड़ी छवियां बनाना I कई छोटी छवियों को एक साथ चिपकाकर एक बहुत बड़ी छवि (25000x25000) बनाने की कोशिश कर रहा हूं। ऐसे बड़े आयामों के साथ Image.new() को कॉल करने पर, पायथन स्मृति से बाहर हो जाता है और मुझे मेमोरी त्रुटि मिलती है।पायथन छवि लाइब्रेरी

क्या रैम में पूरी चीज़ निवासी होने के बिना, इस तरह की छवि को लिखने का कोई तरीका है?

संपादित करें: छवि मैगिक के montage कमांड का उपयोग करके, यह मनमाने ढंग से आकार वाली छवियां बनाना संभव लगता है। ऐसा लगता है कि यह अंतिम छवि को रैम में लोड करने की कोशिश नहीं कर रहा है (यह प्रक्रिया के दौरान बहुत कम स्मृति का उपयोग करता है) बल्कि इसे डिस्क पर स्ट्रीम करना, जो आदर्श है।

+0

क्या छवियों को आरजीबी मोड में होना चाहिए? –

+0

हां, वे रंगीन छवियां हैं। इसके अलावा 25000x25000 वास्तव में पूर्ण छवि का केवल एक छोटा हिस्सा है, जो शायद 175,000x325,000 होने जा रहा है। भले ही छवियां ग्रेस्केल हों, मैं एक छवि का अनुमान लगा रहा हूं कि आकार अभी भी रैम में फिट नहीं होगा। – meatvest

+0

यह आमतौर पर ऐसे प्रश्नों का उत्तर देने में मदद करता है यह जानने के लिए कि आउटपुट का उपयोग कैसे किया जाएगा। कौन सा प्रोग्राम/सिस्टम इस डेटा का उपभोग करेगा (और/या किस उपयोग के लिए)? इसका उत्तर रास्ता इंगित कर सकता है। –

उत्तर

0

जांचें कि क्या आपका सिस्टम वर्चुअल मेमोरी से बाहर चला जाता है या नहीं। यदि ऐसा होता है, तो और जोड़ने का प्रयास करें। इस तरह, आप वर्चुअल मेमोरी उपप्रणाली पर पूरी समस्या को ऑफ़लोड करते हैं, जो तेज़ हो सकता है।

2

बहुत आश्चर्यजनक नहीं है कि आप स्मृति से बाहर हो रहे हैं; उस छवि को स्मृति में 2 गीगा से अधिक ले जाएगा और आपके ओएस का उपयोग कर रहे सिस्टम के आधार पर आपके वास्तविक RAM के बावजूद इसे चलाने के लिए पर्याप्त वर्चुअल मेमोरी आवंटित करने में सक्षम नहीं हो सकता है।

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

0

माईबी आप ओआईआईओ पायथन बाइंडिंग को आजमा सकते हैं जो जीएसओसी छात्र में से एक द्वारा बनाया गया था? OpenImageIO ही छोटे स्मृति का उपयोग बड़ी छवियों पढ़ सकते हैं - लेकिन मैं अपने आप से इसका इस्तेमाल नहीं किया

OIIO: http://openimageio.org अजगर बाइंडिंग का उपयोग कैसे करें: http://openimageio.org/wiki/index.php?title=Python_bindings

वहाँ भी एक छोटे से स्क्रिप्ट "isticher" कहा जाता है जो भी आप चाहते हैं (कम से कम मुझे ऐसा लगता है)

-1

numpy.memmap और png मॉड्यूल का उपयोग करें।

3

आप GDAL लाइब्रेरी का उपयोग करने का प्रयास कर सकते हैं। यह पायथन को बाइंडिंग प्रदान करता है। यहां C12+, सी और पायथन एपीआई का उपयोग करके छवियों को पढ़ने और लिखने के लिए संयुक्त tutorial प्रस्तुत किया गया है, जीडीएएल संचालन और कार्यों का उपयोग करने के आधार पर, जीडीएएल बहुत बड़ी छवियों को संभाल सकता है और छवियों को संसाधित कर सकता है जो रैम में होने के लिए बहुत बड़े हैं।

2

यह सिर्फ बाइनरी फ़ाइल प्रारूप को समझने की बात है। संपीड़ित प्रारूप अधिक कठिन होने जा रहे हैं।

#incremental_write_bmp.py 
import binascii 

data=''' 
0h -2 -42 4D -"BM" -Magic Number (unsigned integer 66, 77) 
2h -4 -46 00 00 00 -70 Bytes -Size of the BMP file 
6h -2 -00 00 -Unused -Application Specific 
8h -2 -00 00 -Unused -Application Specific 
Ah -4 -36 00 00 00 -54 bytes -The offset where the bitmap data (pixels) can be found. 
Eh -4 -28 00 00 00 -40 bytes -The number of bytes in the header (from this point). 
12h -4 -02 00 00 00 -2 pixels -The width of the bitmap in pixels 
16h -4 -02 00 00 00 -2 pixels -The height of the bitmap in pixels 
1Ah -2 -01 00 -1 plane -Number of color planes being used. 
1Ch -2 -18 00 -24 bits -The number of bits/pixel. 
1Eh -4 -00 00 00 00 -0 -BI_RGB, No compression used 
22h -4 -10 00 00 00 -16 bytes -The size of the raw BMP data (after this header) 
26h -4 -13 0B 00 00 -2,835 pixels/meter -The horizontal resolution of the image 
2Ah -4 -13 0B 00 00 -2,835 pixels/meter -The vertical resolution of the image 
2Eh -4 -00 00 00 00 -0 colors -Number of colors in the palette 
32h -4 -00 00 00 00 -0 important colors -Means all colors are important 
36h -3 -00 00 FF -0 0 255 -Red, Pixel (1,0) 
39h -3 -FF FF FF -255 255 255 -White, Pixel (1,1) 
3Ch -2 -00 00 -0 0 -Padding for 4 byte alignment (Could be a value other than zero) 
3Eh -3 -FF 00 00 -255 0 0 -Blue, Pixel (0,0) 
41h -3 -00 FF 00 -0 255 0 -Green, Pixel (0,1) 
44h -2 -00 00 -0 0 -Padding for 4 byte alignment (Could be a value other than zero) 
'''.strip().split('\n') 

open('test.bmp','wb') 
for l in data: 
    b = l.split('-')[2].strip() 
    d = ''.join(b.split()) 
    x = binascii.a2b_hex(d) 
    # this re-opens the file and appends each iteration 
    open('test.bmp','ab').write(x) 

... संवर्द्धित उदाहरण 2x2 बिटमैप लिखेंगे पाया here:

आप यह मानते हुए एक बिटमैप/डीआईबी, इस कोड को चाहते हैं। अब यह हेडर को आपके इच्छित आकार में सेट करना और सही क्रम में अपनी टाईल्स को पढ़ना (और कभी-कभी पुनः पढ़ना) करना है। मैंने इसे एक बहुत बड़ी फाइल के साथ करने की कोशिश की और पाइथन की मेमोरी स्पाइक नहीं देखी। मुझे लगता है कि ओएस पूरी चीज को पढ़ने के बिना फाइल में जोड़ सकता है।