Saltar al contenido

¿Cuál es la mejor manera de guardar metadatos de imágenes junto con un tif?

Solución:

Debería poder hacer esto con un tif, ¿verdad? ¿Ya que tiene un encabezado?

No.

Primero, su premisa es incorrecta, pero eso es una pista falsa. TIFF tiene un encabezado, pero no le permite almacenar metadatos arbitrarios en él.

Pero TIFF es un formato de archivo etiquetado, una serie de fragmentos de diferentes tipos, por lo que el encabezado no es importante aquí. Y siempre puede crear su propio fragmento privado (cualquier ID> 32767) y almacenar lo que desee allí.

El problema es que nada más que su propio código tendrá idea de lo que almacenó allí. Entonces, que tu probablemente Lo que queremos es almacenar EXIF ​​o XMP o algún otro formato estandarizado para extender TIFF con metadatos. Pero incluso allí, EXIF ​​o lo que elija no tendrá una etiqueta para “microscopio”, por lo que, en última instancia, tendrá que almacenar algo como “microscope = george nspam = eggs n” en alguna cadena campo y, a continuación, vuelva a analizarlo usted mismo.

Pero el problema real es que PIL / Pillow no le brinda una manera fácil de almacenar EXIF ​​o XMP o cualquier otra cosa por el estilo.

Primero, Image.info no es para datos extra arbitrarios. En el ahorro de tiempo, generalmente se ignora.

Si observa los documentos PIL para TIFF, verá que lee datos adicionales en un atributo especial, Image.tagy puede guardar datos pasando un tiffinfo argumento de palabra clave para el Image.save método. Pero esos datos adicionales son un mapeo de ID de etiquetas TIFF a trozos de datos binarios. Puede obtener los ID de etiqueta Exif de los indocumentados PIL.ExifTags.TAGS dict (o buscándolos en línea usted mismo), pero eso es todo el apoyo que PIL le brindará.

Además, tenga en cuenta que acceder tag y usando tiffinfo en primer lugar, requiere una versión razonablemente actualizada de Pillow; las versiones anteriores y el PIL clásico no lo admitían. (Irónicamente, ellos hizo tienen soporte EXIF ​​parcial para archivos JPG, que nunca se terminó y se ha eliminado …) Además, aunque no parece estar documentado, si construiste Pillow sin libtiff parece ignorar tiffinfo.

Entonces, en última instancia, lo que probablemente querrá hacer es:

  • Elija el formato de metadatos que desee.
  • Utilice una biblioteca diferente a PIL / Pillow para leer y escribir esos metadatos. (Por ejemplo, puede usar GExiv2 o pyexif para EXIF.)

Para uso interno, intente guardar los metadatos como JSON en la etiqueta TIFF ImageDescription, p. Ej.

from __future__ import print_function, unicode_literals

import json
import numpy
import tifffile  # http://www.lfd.uci.edu/~gohlke/code/tifffile.py.html

data = numpy.arange(256).reshape((16, 16)).astype('u1')
metadata = dict(microscope="george", shape=data.shape, dtype=data.dtype.str)
print(data.shape, data.dtype, metadata['microscope'])

metadata = json.dumps(metadata)
tifffile.imsave('microscope.tif', data, description=metadata)

with tifffile.TiffFile('microscope.tif') as tif:
    data = tif.asarray()
    metadata = tif[0].image_description
metadata = json.loads(metadata.decode('utf-8'))
print(data.shape, data.dtype, metadata['microscope'])

Tenga en cuenta que JSON usa cadenas Unicode.

Para ser compatible con otro software de microscopía, considere guardar archivos OME-TIFF, que almacenan metadatos definidos como XML en la etiqueta ImageDescription.

Tifffile es una opción para guardar imágenes de microscopía con muchos metadatos en Python.

No tiene mucha documentación externa, pero los documentos son geniales, por lo que puede obtener mucha información con solo escribir ayuda (tifffile) en Python, o mira el código fuente.

Puede buscar en la función TiffWriter.save en el código fuente (línea 750) los diferentes argumentos de palabras clave que puede usar para escribir metadatos.

Uno es usar descripción, que acepta una cadena. Aparecerá como la etiqueta “ImageDescription” cuando lea su imagen.

Otro es usar el Etiquetas extra argumento, que acepta una lista de tuplas. Eso le permite escribir cualquier nombre de etiqueta que exista en TIFF.TAGS (). Una de las formas más sencillas es escribirlas como cadenas porque entonces no es necesario especificar la longitud.

También puede escribir metadatos de ImageJ con ijmetadata, cuyos tipos aceptables se enumeran en el código fuente aquí.

Como ejemplo, si escribe lo siguiente:

import json
import numpy as np
import tifffile

im = np.random.randint(0, 255, size=(150, 100), dtype=np.uint8)
# Description
description = "This is my description"
# Extratags
metadata_tag = json.dumps({"ChannelIndex": 1, "Slice": 5})
extra_tags = [("MicroManagerMetadata", 's', 0, metadata_tag, True),
              ("ProcessingSoftware", 's', 0, "my_spaghetti_code", True)]
# ImageJ metadata. 'Info' tag needs to be a string
ijinfo = {"InitialPositionList": [{"Label": "Pos1"}, {"Label": "Pos3"}]}
ijmetadata = {"Info": json.dumps(ijinfo)}
# Write file
tifffile.imsave(
    save_name,
    im,
    ijmetadata=ijmetadata,
    description=description,
    extratags=extra_tags,
)

Puede ver las siguientes etiquetas cuando lee la imagen:

frames = tifffile.TiffFile(save_name)
page = frames.pages[0]
print(page.tags["ImageDescription"].value)

Fuera: ‘esta es mi descripción’

print(page.tags["MicroManagerMetadata"].value)

Salida: {‘ChannelIndex’: 1, ‘Slice’: 5}

print(page.tags["ProcessingSoftware"].value)

Fuera: my_spaghetti_code

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *