2011-10-07 6 views
6

Desidero utilizzare le immagini TIFF per salvare in modo efficace grandi matrici di dati di misurazione. Impostandoli su mode = "I; 16" (corrispondente al mio intervallo di dati a 16 bit), producono file da 2MB (~ 1000x1000 "pixel"). Che è buono.numpy.array di un file di immagine "I; 16"

Tuttavia, ho problemi a riconvertirli in array quando si tratta di analizzarli. Per i dati a 32 bit (-> "I") il comando numpy.array funziona correttamente. In caso di "I; 16" il risultato è una matrice numerica 0D con il TIFF come [0,0].

C'è un modo per farlo funzionare? Mi piacerebbe davvero evitare l'uso di immagini a 32 bit, poiché non ho bisogno dell'intervallo e raddoppia lo spazio necessario sull'HDD (molte e quante sono programmate ...)

+1

Puoi mostrarci il codice per caricare l'immagine? Stai usando la classe 'Image' di PIL? –

+0

Uso la classe Image e per caricare le immagini uso semplicemente Image.open ("im.tif") – Jakob

+1

bug bug: http://stackoverflow.com/questions/7247371/python-and-16-bit-tiff – mankoff

risposta

6

Questo dovrebbe funzionare (soluzione cuscino/PIL, lento per l'immagine a 16 bit, vedi sotto).

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]) 

Un'altra soluzione utilizzando tifffile di C. Gohlke (molto veloce):

import tifffile 

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

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

Sono riuscito in qualche modo a non notare la tua risposta prima di pubblicare il mio. Sono d'accordo, questa è la soluzione migliore, ma penso che sia necessario riordinare la dimensione della risagoma ... Dovrebbe essere '... reshape (im2.size [:: - 1])' –

+0

grazie, è perfetto – Jakob

+0

Giusto! im.size => (larghezza, altezza) ma vogliamo che il nostro array numpy sia in (altezza, larghezza). Grazie per la correzione. – otterb

3

Si potrebbe utilizzare GDAL + Numpy/SciPy a leggere le immagini raster con dati del canale a 16 bit:

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

Convertire un TIFF (ImageJ) in un array numpy a 8 bit

im = numpy.array(Image.open('my.tiff')) 
n = (im/numpy.amax(im) * 255).astype(numpy.uint8)