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>