Lectura y decodificación de los metadatos en imágenes de la cámara Sequoia

Los metadatos son datos que nos proporcionan información sobre los datos, entre ellos los descriptivos, estructurales y administrativos. Estos pueden ser escritos en iḿagenes como las que toma nuestra cámara, que ayudarán en el proceso posterior de producción a partir de palabras clave.

Tipos de metadatos en imágenes

Las imágenes pueden contener diferentes metadatos, regidos por las normas creadas por organizaciones encargadas de ello; algunas de estas normas son:

  • IPTC
  • IPTC para XMP
  • XMP
  • EXIF
  • Dublin Core
  • PLUS
  • VRA

Librerías de lectura de metadatos: Exiftools

Al haber tratado ya los metadatos de las imágenes de la Sequoia, avanzo la necesidad de interpretar metadatos del estandar XMP, una marca registrada por Adobe Systems que cuando pasó a ser ISO, dejó se ser propietaria.

Por lo tanto, necesitaremos buscar un software (libre) capaz de leer XMP, a continuación los que he probado:

GIMP y ImageMagick vienen por defecto en Debian. Sin embargo Exiftool lo tenemos que instalar:

# instalar exiftool
 apt-cache install libimage-exiftool-perl

Mostrar los metadatos de una imagen

exiftool imagen.tif

ImageMagick también se puede ejecutar desde la terminal:

identify -verbose imagen.tif

Resultados exiftool, Resultados ImageMagick


Con Exiftools

system ("exiftool /home/joan/multispectralcam/test/IMG_170825_082736_0004_NIR.TIF")

Exportar metadatos a csv

output <- system ( "exiftool -n -csv /home/joan/multispectralcam/test/IMG_170825_082736_0004_NIR.TIF" , intern = TRUE )
df <- read.csv ( textConnection ( output ), stringsAsFactors = FALSE )
write.csv(df, file = "/home/joan/Escritorio/test.csv")

Decodificar formato Base64 mediante Python

Se pueden apreciar metadatados muy valiosos para la investigación, como:

  1. Yaw, pitch y roll
  2. Viñeteado
  3. Valor de luminosidad
  4. Calibraciones
  5. Corriente oscura
  6. etc…

Pero.. ¿Y la etiqueta IrradianceList? ***

Esta etiqueta viene codificada en Base64, un sistema de numeración posicional que utiliza el 64 como base y carácteres ASCII (usa el rango entre A-Z, a-z y 0-9, más dos símbolos que pueden variar). De manera que tenemos la siguiente cadena de carácteres:

U5UwEQAAAABaBa4CAQBkAHAJ6sLRfAHBo95bwBegMxEAAAAAnAXQAgEAZACLX+zCj/G+wImc0b/rrDYRAAAAAKIF0wIBAGQAltDqwi1DusAigqS/M8I5EQAAAADNBGgCAQBkANc958JGokfBxkHAPsbZPBEAAAAA+AP9AQEAZACYTeXCGYhEwV7Bsb833z8RAAAAAOQD8gEBAGQA21LqwrSgfcHvtz3ACeVCEQAAAADzA/oBAQBkAICY+cK6j6HBPJaJQLL3RREAAAAAbAO3AQEAZAC0rQPD67Hbwa0xNEE+CUkRAAAAAM8D6AEBAGQAS8j8wj+alsH7+SrBeA1MEQAAAAAPBYkCAQBkAA/iBMP/TBjCafi/wPkFTxEAAAAArgRZAgEAZABL0ATDLYzwwSFcr78KF1IRAAAAAI0FyAIBAGQAfjkBw6Iwc8FEj6LAcyRVEQAAAABsBbgCAQBkAJ/d+8K8cFbBgX6owA==


Para poder decodificarlo se han utilizado una serie de librerías en Python:

Este es el script utilizado:

import exiftool
import base64
import struct
import glob
import os

tag = "XMP:IrradianceList"

directorio = 'test'
canales = ['GRE','RED','REG','NIR']

index = 0

for canal in canales:
    files = glob.glob(os.path.join(directorio, '*' + canal + '*'))

    with exiftool.ExifTool() as et:
        metadata = et.get_tag_batch(tag, files)

        #print metadata
        for file_metadata in metadata:
            decoded = base64.b64decode(file_metadata)

        index += 1

        for i in range(0, len(decoded), 28):
            print struct.unpack("qHHHHfff", decoded[i:i+28])


Resultados

irradianceList <-read.table("/home/joan/multispectralcam/decode.csv", header= T, sep=",")
knitr::kable(irradianceList)

Como se puede apreciar, aparecen muchas filas de datos, sin embargo solo necesitamos 1, la última obtenida por imagen. Las filas pueden variar según la imagen, esto es debido a que parece que la cámara guarda información a 5Hz.