python numpy python-imaging-library tiff

Trabajando con TIFF(importación, exportación) en Python usando numpy



python-imaging-library (6)

En el caso de las pilas de imágenes, me resulta más fácil usar scikit-image para leer, y matplotlib para mostrar o guardar. He manejado pilas de imágenes TIFF de 16 bits con el siguiente código.

from skimage import io import matplotlib.pyplot as plt # read the image stack img = io.imread(''a_image.tif'') # show the image plt.imshow(mol,cmap=''gray'') plt.axis(''off'') # save the image plt.savefig(''output.tif'', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)

Necesito una rutina de python que pueda abrir e importar imágenes TIFF en matrices numpy, para que pueda analizar y modificar los datos contenidos y luego guardarlos como TIFF nuevamente. (Básicamente son mapas de intensidad de luz en escala de grises, que representan los valores respectivos por píxel)

Traté de encontrar algo, pero no hay documentación sobre los métodos de PIL relacionados con TIFF. Traté de resolverlo, pero solo obtuve errores de tipo de modo / archivo no soportados.

¿Qué necesito usar aquí?


También puedes usar pytiff del cual soy el autor.

import pytiff with pytiff.Tiff("filename.tif") as handle: part = handle[100:200, 200:400] # multipage tif with pytiff.Tiff("multipage.tif") as handle: for page in handle: part = page[100:200, 200:400]

Es un módulo bastante pequeño y puede no tener tantas características como otros módulos, pero admite tiffs y bigtiff en mosaico, por lo que puede leer partes de imágenes grandes.


También puedes usar GDAL para hacer esto. Me doy cuenta de que es un conjunto de herramientas geoespaciales, pero nada requiere que tengas un producto cartográfico.

Enlace a los binarios GDAL precompilados para Windows (asumiendo ventanas aquí) http://www.gisinternals.com/sdk/

Para acceder a la matriz:

from osgeo import gdal dataset = gdal.Open("path/to/dataset.tiff", gdal.GA_ReadOnly) for x in range(1, dataset.RasterCount + 1): band = dataset.GetRasterBand(x) array = band.ReadAsArray()


Yo uso matplotlib para leer archivos TIFF:

import matplotlib.pyplot as plt I = plt.imread(tiff_file)

y seré del tipo ndarray .

De acuerdo con la documentación, aunque en realidad es PIL lo que funciona entre bastidores cuando se manejan TIFF, ya que matplotlib solo lee PNG nativamente, pero esto ha funcionado bien para mí.

También hay una función plt.imsave para guardar.


pylibtiff funcionó mejor para mí que PIL (que no admite imágenes en color con más de 8 bits por color ).

from libtiff import TIFF tif = TIFF.open(''filename.tif'', mode=''r'') # read an image in the currect TIFF directory as a numpy array image = tif.read_image() # read all images in a TIFF file: for image in tif.iter_images(): pass tif = TIFF.open(''filename.tif'', mode=''w'') tif.write_image(image)

Si estás en python3 no pip3 install libtiff . En cambio, instale manualmente con

git clone [email protected]:pearu/pylibtiff.git python3 setup.py install

el léame de pylibtiff también menciona tifffile.py , pero no lo he probado.


Primero, descargué una imagen TIFF de prueba de esta página llamada a_image.tif . Luego abrí con PIL de esta manera:

>>> from PIL import Image >>> im = Image.open(''a_image.tif'') >>> im.show()

Esto mostró la imagen del arcoíris. Para convertir a una matriz numpy, es tan simple como:

>>> import numpy >>> imarray = numpy.array(im)

Podemos ver que el tamaño de la imagen y la forma de la matriz coinciden:

>>> imarray.shape (44, 330) >>> im.size (330, 44)

Y la matriz contiene valores uint8 :

>>> imarray array([[ 0, 1, 2, ..., 244, 245, 246], [ 0, 1, 2, ..., 244, 245, 246], [ 0, 1, 2, ..., 244, 245, 246], ..., [ 0, 1, 2, ..., 244, 245, 246], [ 0, 1, 2, ..., 244, 245, 246], [ 0, 1, 2, ..., 244, 245, 246]], dtype=uint8)

Una vez que haya terminado de modificar la matriz, puede volver a convertirla en una imagen PIL como esta:

>>> Image.fromarray(imarray) <Image.Image image mode=L size=330x44 at 0x2786518>