Necesito un método de Python para abrir e importar imágenes TIFF en matrices numerosas para poder analizar y modificar los datos de píxeles y luego guardarlos como TIFF nuevamente. (Básicamente son mapas de intensidad de luz en escala de grises, que representan los respectivos valores por píxel)
No pude encontrar ninguna documentación sobre los métodos PIL relacionados con TIFF. Traté de averiguarlo, pero solo obtuve errores de "modo incorrecto" o "tipo de archivo no admitido".
¿Qué necesito usar aquí?
Yo uso matplotlib para leer archivos TIFF:
import matplotlib.pyplot as plt I = plt.imread(tiff_file)
y
I
será de tipondarray
.De acuerdo con la documentación, aunque en realidad es PIL el que funciona detrás de escena cuando se manejan TIFF, ya que matplotlib solo lee PNG de forma nativa, pero esto me ha funcionado bien.
También hay una
plt.imsave
función para guardar.fuente
ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
También puede 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 Windows 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()
fuente
.astype(sometype)
llamada al final de laReadAsArray()
llamada para transmitir. No estoy seguro si esto hace una copia (simplemente no lo he probado).xrange
no es un error tipográfico,xrange
es la versión de Python 2 derange
. Acepté esta edición porque Python 3 todavía se está mejorando activamente, mientras que Python 2 no.pylibtiff funcionó mejor para mí que PIL, que a partir de junio de 2020 no admite imágenes en color con más de 8 bits por color .
from libtiff import TIFF tif = TIFF.open('filename.tif') # open tiff file in read mode # 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)
Puede instalar pylibtiff con
El archivo léame de pylibtiff también menciona
tifffile
, pero no lo he probado y aunque es aparentemente de código abierto, no creo que el código esté disponible en ninguna parte (además de extraerlo manualmente del paquete PyPI).fuente
También puede usar pytiff del que soy 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 que no tenga tantas funciones como otros módulos, pero admite tiffs en mosaico y bigtiff, por lo que puede leer partes de imágenes grandes.
fuente
En el caso de las pilas de imágenes, me resulta más fácil de usar
scikit-image
para leer ymatplotlib
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)
fuente
Recomiendo usar los enlaces de Python a OpenImageIO, es el estándar para tratar con varios formatos de imagen en el mundo de vfx. A menudo lo he encontrado más confiable para leer varios tipos de compresión en comparación con PIL.
import OpenImageIO as oiio input = oiio.ImageInput.open ("/path/to/image.tif")
fuente