2011-10-07 6 views
6

की numpy.array मैं माप डेटा के बड़े सरणी प्रभावी ढंग से सहेजने के लिए टीआईएफएफ छवियों का उपयोग करना चाहता हूं। उन्हें मोड = "आई; 16" (मेरे 16 बिट डेटा रेंज के अनुरूप) पर सेट करने के साथ, वे 2 एमबी फाइलें (~ 1000x1000 "पिक्सेल") उत्पन्न करते हैं। कौन सा अच्छा है।"i; 16" छवि फ़ाइल

हालांकि मुझे विश्लेषण करने की बात आने पर उन्हें एरे में पुन: स्थापित करने में समस्याएं आ रही हैं। 32 बिट डेटा के लिए (-> "मैं") numpy.array कमांड ठीक काम करता है। "आई; 16" के मामले में परिणाम टीआईएफएफ के साथ 0 डी numpy सरणी है [0,0] प्रविष्टि के रूप में।

क्या यह काम करने के लिए कोई तरीका है? मैं वास्तव में 32 बिट छवियों का उपयोग करने से बचना चाहूंगा, क्योंकि मुझे सीमा की आवश्यकता नहीं है और यह आवश्यक एचडीडी स्पेस को दोगुना करता है (बहुत सारे और उन मापों की योजना बनाई गई है ...)

+1

क्या आप हमें कोड दिखा सकते हैं कि आप छवि को कैसे लोड करते हैं? क्या आप पीआईएल की 'छवि' कक्षा का उपयोग कर रहे हैं? –

+0

मैं छवि वर्ग का उपयोग करें, और छवियों मैं बस Image.open ("im.tif") – Jakob

+1

जनहित याचिका बग का उपयोग लोड करने के लिए: http://stackoverflow.com/questions/7247371/python-and-16-bit-tiff – mankoff

उत्तर

6

यह काम करना चाहिए (तकिया/पीआईएल समाधान, 16-बिट छवि के लिए धीमा, नीचे देखें)।

from PIL import Image 
import numpy as np 

data = np.random.randint(0,2**16-1,(1000,1000)) 
im = Image.fromarray(data) 
im.save('test.tif') 

im2 = Image.open('test.tif') 
data2 = np.array(im2.getdata()).reshape(im2.size[::-1]) 

tifffile का उपयोग कर एक अन्य समाधान सी Gohlke (बहुत तेजी से) द्वारा:

import tifffile 

fp = r'path\to\image\image.tif' 

with tifffile.TIFFfile(fp) as tif: 
    data = tif.asarray() 
+2

मैंने पोस्ट करने से पहले किसी भी तरह से आपका जवाब नहीं देखा। मैं मानता हूं, यह सबसे अच्छा कामकाज है, लेकिन मुझे लगता है कि आपको reshape के आकार को फिर से व्यवस्थित करने की आवश्यकता है ... यह होना चाहिए ... reshape (im2.size [:: - 1]) ' –

+0

धन्यवाद, यह सही है – Jakob

+0

सही! im.size => (चौड़ाई, ऊंचाई) लेकिन हम चाहते हैं कि हमारी numpy सरणी (ऊंचाई, चौड़ाई) में हो। सुधारों के लिए धन्यवाद। – otterb

3

आप GDAL + Numpy/SciPy इस्तेमाल कर सकते हैं 16bit चैनल डेटा के साथ रेखापुंज छवियों को पढ़ने के लिए:

import gdal 
tif = gdal.Open('path.tif') 
arr = tif.ReadAsArray() 
0

एक (छविजे) टीआईएफएफ को 8 बिट numpy सरणी

im = numpy.array(Image.open('my.tiff')) 
n = (im/numpy.amax(im) * 255).astype(numpy.uint8) 
में कनवर्ट करें