2013-02-16 12 views
5

मेरे पास कुछ बहुत बड़ी छवियां हैं I मैं पूरी छवि को स्मृति में लोड नहीं करना चाहता, मैं सिर्फ पंक्ति क्रम में छवि के माध्यम से एक एकल पास करना चाहता हूं। क्या यह पाइथन/scipy में ऐसा करना संभव है?क्या आप पूरी छवि लोड किए बिना किसी छवि में पिक्सल के माध्यम से लूप कर सकते हैं?

संपादित करें: मैं पीएनजी का उपयोग कर रहा हूं, लेकिन मैं उन्हें पीपीएम, बीएमपी या कुछ और हानि रहित में परिवर्तित कर सकता हूं।

+1

कई मामलों में, हाँ, लेकिन यह छवि और उस लाइब्रेरी के प्रारूप पर निर्भर करता है जिसका आप इसे पढ़ने के लिए उपयोग कर रहे हैं। आपकी छवियां क्या प्रारूप हैं? –

+0

मैं पीएनजी फ़ाइल प्रारूप का उपयोग कर रहा हूँ। – nickponline

+1

टीआईएफएफ इसे विशेष रूप से आसान बना देगा, लेकिन मुझे नहीं लगता कि पीआईएल बैंड द्वारा टीआईएफएफ पढ़ने का समर्थन करता है। – Jaime

उत्तर

2

GDAL (पायथन बाइंडिंग के साथ) इसके लिए कुछ बहुत अच्छे ड्राइवर प्रदान करता है। हालांकि यह एक भू-स्थानिक पैकेज है, उदाहरण के लिए यह बीएमपी और पीएनजी के साथ ठीक काम करता है।

import gdal 

# only loads the dataset 
ds = gdal.Open('D:\\my_large_image.png') 

# read 1 row at the time 
for row in range(ds.RasterYSize): 
    row_data = ds.ReadAsArray(0,row,ds.RasterXSize,1) 

ds = None # this closes the file 

यह आप एक परिणाम के रूप में एक Numpy सरणी देता है, procesing लिए बहुत तैयार: इस उदाहरण कैसे पंक्ति से एक PNG पंक्ति लोड करने के लिए दिखाई देते हैं। आप किसी भी परिणाम को एक ही फैशन में लिख सकते हैं।

print type(row_data) 
<type 'numpy.ndarray'> 

print row_data.shape 
(3, 1, 763) 

print row_data 
[[[ 0 0 255 ..., 230 230 0]] 

[[ 0 0 252 ..., 232 233 0]] 

[[ 0 0 252 ..., 232 233 0]]] 

पढ़ने के लिए विशिष्ट पैकेज स्थापित करना थोड़ा अधिक हो सकता है यदि पीआईएल या कुछ और कर सकता है। लेकिन यह एक मजबूत विकल्प है, मैंने इस तरह 30000 * 30000 पिक्सेल की छवियों को संसाधित किया है।

संबंधित मुद्दे

 संबंधित मुद्दे