2011-10-07 15 views
6

Quiero usar imágenes TIFF para guardar con eficacia grandes conjuntos de datos de medición. Al establecerlos en mode = "I; 16" (correspondiente a mi rango de datos de 16 bits), producen archivos de 2MB (~ 1000x1000 "pixel"). Lo que es bueno.numpy.array de un archivo de imagen "I; 16"

Sin embargo, estoy teniendo problemas para reconvertirlos en matrices cuando se trata de analizarlos. Para datos de 32 bits (-> "I"), el comando numpy.array funciona bien. En el caso de "I; 16", el resultado es una matriz 0D numpy con el TIFF como entrada [0,0].

¿Hay alguna manera de hacer que funcione? Realmente me gustaría evitar el uso de imágenes de 32 bits, ya que no necesito el rango y dobla el espacio en disco duro (muchas y muchas de esas medidas planificadas ...)

+1

¿Puede mostrarnos el código de cómo carga la imagen? ¿Estás usando la clase 'Imagen' de PIL? –

+0

Uso la clase de imagen, y para cargar las imágenes simplemente uso Image.open ("im.tif") – Jakob

+1

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

Respuesta

6

Esto debería funcionar (almohada/solución PIL, lento para una imagen de 16 bits, ver abajo).

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

Otra solución usando tifffile por C. Gohlke (muy rápido):

import tifffile 

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

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

Logré de alguna manera no darme cuenta de tu respuesta antes de publicar la mía. Estoy de acuerdo, esta es la mejor solución, pero creo que debes reordenar el tamaño de la remodelación ... Debería ser '... reshape (im2.size [:: - 1])' –

+0

gracias, eso es perfecto – Jakob

+0

¡Correcto! im.size => (ancho, alto) pero queremos que nuestra matriz numpy esté en (alto, ancho). Gracias por la corrección. – otterb

3

Usted podría utilizar GDAL + Numpy/Scipy a leer las imágenes de mapa de bits con datos de canal de 16 bits:

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

Convierta un (ImagenJ) TIFF en una matriz numpy de 8 bits

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