DEV Community

Cover image for Extração de metadados de imagens com Python
msc2020
msc2020

Posted on • Originally published at dev.to

Extração de metadados de imagens com Python

Neste post, falamos sobre os metadados de imagens. Mostramos como usar ferramentas na linguagem Python para extrair esse tipo de informação.

Atualmente, na "Era dos Dados/IA", é comum ouvir que "Dados são o novo petróleo". Não é difícil entender esse jargão, mas fica a dúvida: "Se os dados são análogos ao petróleo, nos dias de hoje, os metadados seriam comparáveis ao que"?


Um pouco sobre imagens e metadados

Antes de rodar o código Python que fará a extração dos metadados, vejamos rapidamente alguns pontos sobre as imagens digitais.

Como é formado um arquivo de imagem?

De forma resumida, uma imagem digital é um arquivo, no formato PNG, JPEG, GIF, etc., que segue as especificações que o definem. Assim como muitos arquivos digitais, no computador as imagens podem ser representadas por matrizes, onde cada entrada da matriz está associada a um pixel. Essa relação não é biunívoca, pois depende da configuração do computador usado para trabalhar com a imagem. Se uma imagem digital tem resolução 800 X 600 (largura X altura), então corresponde a um total de 480.000 pixels na tela do computador. Geralmente, quando se aplica alguma transformação numa imagem, estamos realizando operações com matrizes/submatrizes de pixels.

O que significa o prefixo meta?

Segundo o dicionário online Priberam, o prefixo meta é uma palavra que "exprime a noção de reflexão sobre si (ex.: metalinguagem)". Dessa maneira, o termo metadados significa "dados sobre algum dado". Neste post, focamos nas imagens e seus metadados. Muitas vezes o sistema operacional do computador acessa esses dados para alguma finalidade.

Os metadados de uma imagem são obrigatórios?

Assim como cada imagem pode ter um formato diferente, as informações que essas imagens carregam sobre si também podem mudar. Para ilustrar, nas respectivas extensões, os formatos GIF (lançado em 1987), JPEG (introduzida em 1982) e WebP (de 2010) possuem especificações diferentes para sua formação. A palavra hexadecimal usada para identificar cada um destes é diferente. Mais detalhes podem ser encontrados neste link.

Além disso, as imagens podem ser geradas em contextos particulares e por dispositivos com característica diferentes, como imagens de satélite, imagens médicas, imagens geofísicas, etc. Isso adiciona maior complexidade para uma padronização única dos metadados de imagens. Os metadados de imagens costumam variar ou mesmo serem excluídos. O WhatsApp serve de exemplo de um aplicativo que costuma remover alguns metadados de imagens enviadas através dele.


Como extrair os metadados usando Python?

Agora veremos como extrair os metadados de uma imagem na prática. Para isso usaremos a biblioteca open source chamada Hachoir.

Mata-Atlântica

Fonte: www.ecolibrary.org/page/DP43 | Licença: https://creativecommons.org/licenses/by-nc/3.0/us/

Hachoir

A ferramenta Hachoir é uma biblioteca Python que permite extrairmos metadados de arquivos como imagens, vídeos, áudio, entre outros. Sua documentação traz exemplos interessantes.

Instalação: Para instalá-lo Hachoir, basta digitar o seguinte comando num terminal com Python 3 instalado:

pip install hachoir
Enter fullscreen mode Exit fullscreen mode

Código usado: Para realizar a extração dos metadados usaremos o script abaixo:

# extrai_metadados.py
import hachoir.metadata
import hachoir.parser
from hachoir.core import config as HachoirConfig
HachoirConfig.quiet = True

img_path = 'mata_atlantica.jpg'
# www.ecolibrary.org/page/DP43
# license: https://creativecommons.org/licenses/by-nc/3.0/us/

filename = img_path
parser = hachoir.parser.createParser(filename)

hachoir_metadata = hachoir.metadata.extractMetadata(parser)
metadata = hachoir_metadata.exportDictionary()['Metadata']
print(metadata)
Enter fullscreen mode Exit fullscreen mode

Note que a variável img_path é onde definimos o caminho até o arquivo de imagem que escolhemos. No caso, foi escolhido uma foto em JPG, mas poderíamos ter escolhido um outro formato.

Podemos rodar o script extrai_metadados.py mencionado acima com:

python extrai_metadados.py
Enter fullscreen mode Exit fullscreen mode

Saída esperada: Após rodar esse script, obtemos como resposta um dicionário Python (semelhante a um json):

{"Author": "Dan L. Perlman",
"Image width": "1024 pixels",
"Image height": "768 pixels",
"Image orientation": "Horizontal (normal)",
"Bits/pixel": "24",
"Pixel format": "YCbCr",
"Image DPI width": "93 DPI",
"Image DPI height": "93 DPI",
"Creation date": "2008-03-20 16:53:27",
"Camera focal": "19",
"Camera exposure": "1/4",
"Camera brightness": "5.16",
"Camera model": "FinePixS2Pro",
"Camera manufacturer": "FUJIFILM",
"Compression": "JPEG (Baseline)",
"Copyright": "© Dan L. Perlman 2008
http://creativecommons.org/licenses/by-nc/3.0/us/",
"Thumbnail size": "8471 bytes",
"ISO speed rating": "100",
"EXIF version": "0220",
"Date-time original": "2004-10-23 09:47:24",
"Date-time digitized": "2004-10-23 09:47:24",
"Compressed bits per pixel": "3.2",
"Shutter speed": "2",
"Aperture": "8.5",
"Exposure bias": "0",
"Focal length": "18",
"Flashpix version": "0100",
"Focal plane width": "1.86e+03",
"Focal plane height": "1.86e+03",
"Focal length in 35mm film": "27",
"Producer": "Adobe Photoshop CS3 Windows",
"Comment": "JPEG quality: 91% (approximate)",
"Format version": "JFIF 1.02",
"MIME type": "image/jpeg",
"Endianness": "Big endian"}
Enter fullscreen mode Exit fullscreen mode

Acima temos os metadados extraídos da imagem que escolhemos para este teste. Parte desses itens são extraídos do EXIF, uma padronização que especifica formatos para imagens geradas por dispositivos como câmeras, smartphones, scanner, etc. Com o EXIF é possível obter dados de data e hora, informações do dispositivo usado na geração da imagem, geolocalização, métricas sobre os pixels e os direitos autorais da imagem.

Observações sobre os metadados extraídos

Para a imagem JPG que usamos (mata_atlantica.jpg), a resposta do script extrai_metadados.py fornece informações básicas como:

"Image width": "1024 pixels",
"Image height": "768 pixels",
"Image orientation": "Horizontal (normal)",
"Bits/pixel": "24",
"Pixel format": "YCbCr",
"MIME type": "image/jpeg",
"Endianness": "Big endian"
...
Enter fullscreen mode Exit fullscreen mode

Também há informações sobre o dispositivo usado para gerar essa imagem:

"Camera focal": "19",
"Camera exposure": "1/4",
"Camera brightness": "5.16",
"Camera model": "FinePixS2Pro",
"Camera manufacturer": "FUJIFILM",
"Shutter speed": "2",
"Aperture": "8.5",
"Exposure bias": "0",
"Focal length": "18",
"Flashpix version": "0100",
"Focal plane width": "1.86e+03",
"Focal plane height": "1.86e+03",
"Focal length in 35mm film": "27"
...
Enter fullscreen mode Exit fullscreen mode

Curiosidade: Pelos metadados, a máquina usada para tirar a foto foi uma FUJIFILM FinePix S2 Pro.

Os metadados extraídos ainda trazem a data de criação, autoria e licença de uso da imagem:

"Author": "Dan L. Perlman",
"Creation date": "2008-03-20 16:53:27",
"Date-time original": "2004-10-23 09:47:24",
"Date-time digitized": "2004-10-23 09:47:24",
"Copyright": "© Dan L. Perlman 2008
http://creativecommons.org/licenses/by-nc/3.0/us/"
...
Enter fullscreen mode Exit fullscreen mode

Nota: Embora para mata_atlantica.jpg foi possível a extração de inúmeros metadados, pode ser que isso mude conforme a imagem escolhida. Dependendo da caso, os dados extraídos podem ser diferentes dos apresentados neste exemplo.

Lembremos ainda que os metadados são editáveis. Ou seja, uma imagem pode ter informações detalhadas, ou não, sobre sua criação. Já o objeto real, usado para gerar a imagem digital, não muda (excluindo situações particulares).

Agradecemos a leitura! Vc conhece algum caso de uso que ache interessante e envolva metadados? Compartilhe, será bem-vindo!

📖 . 🤖 .. ☕ ... 🐌 .... 🦥 ..... 👾 ..... 👻💡

* A imagem de capa deste post foi gerada com um text-to-image usando a frase "Data about data about data about data about data ad infinitum in pt-br".

Top comments (0)