Como fazer diff entre duas imagens

Publicado por Fábio Berbert de Paula em 19/08/2013

[ Hits: 8.211 ]

Blog: https://fabio.automatizando.dev

 


Como fazer diff entre duas imagens



Esta semana, me surgiu a necessidade de automatizar a comparação entre duas imagens e pesquisando na Internet, encontrei uma solução melhor que por encomenda. :)

Nosso pré-requisito é o pacote ImageMagick. Em Debian e derivados:

sudo apt-get install imagemagick

Neste exemplo, tenho duas imagens: "tux01.png" e "tux02.png". O comando para compará-las, é:

convert tux01.png tux02.png -resize '400x300!' MIFF:- | compare -metric AE -fuzz '10%' - null:
1982

O resultado será a quantidade de pixels diferentes entre as imagens, que neste caso, foi "1982". Se as imagens forem idênticas, o resultado será zero.

Explicando: o convert recebe como parâmetros as duas imagens (tux01.png tux02.png) e as redimensiona para um tamanho em comum (-resize '400x300!'). Feito isso, elas são repassadas ao comando compare, que calculará a quantidade de pixels diferentes.

Agora, vamos converter o comando acima em script, para facilitar nossa vida.

#!/bin/sh

PERCENT="25"
FUZZ="10"

[ "$#" != "2" ] && echo "Syntax: $0 IMAGE1 IMAGE2" >&2 && exit 2
IMG1="$1"
IMG2="$2"

SIZE1=$(stat -c '%s' "$IMG1")
SIZE2=$(stat -c '%s' "$IMG2")

if [ "$SIZE1" -lt "$SIZE2" ]
then
   BIG="$IMG2"
   SMALL="$IMG1"
else
   BIG="$IMG1"
   SMALL="$IMG2"
fi

#echo "1) Scaling both images to $PERCENT% of smaller image"
#echo "2) Counting different pixels (color distance > $FUZZ%)"

SIZE=$(identify -format '%wx%h' "$SMALL")

W=$(echo "$SIZE" | cut -dx -f1)
H=$(echo "$SIZE" | cut -dx -f2)

W=$(( ($W * $PERCENT) / 100 ))
H=$(( ($H * $PERCENT) / 100 ))

DIFF=$(
convert "$SMALL" "$BIG" -resize "$W"x"$H"\! MIFF:- | compare -metric AE -fuzz "$FUZZ%" - null: 2>&1
)
[ "$?" != "0" ] && echo "$DIFF" >&2

DIFF_RATIO=$(awk "BEGIN {printf \"%.3f\n\", ($DIFF / ($W*$H))*100 }")
echo "pixel difference: $DIFF_RATIO%"

if [ "$DIFF" = 0 ]
then
   echo "OK"
   exit 0
else
   echo "NOK"
   exit 1
fi

Salve o script e torne-o executável. Salvei como imdiff:

imdiff tux01.png tux02.png
pixel difference: 2.155%
NOK

DEVER DE CASA: Leia a man page do comando compare (man compare). Um dia ele pode ser uma mão na roda pra você.

100% desta solução foi retirada do blog abaixo (inglês):
Outras dicas deste autor

O comando rename na prática

Vim - selecionar tudo e copiar fácil

Como evitar execução de backdoors em diretórios de upload do teu site

Vim - substituição de caracteres especiais do Windows

Múltiplas expressões no SED

Leitura recomendada

Exibir arquivo de grupos /etc/group de forma personalizada conforme o usuário

Criando um script para acessar sua unidade Zip

Políticas personalizadas do SELinux

SHC - Compilando seu shell script

Sockets em shell script

  

Comentários
[1] Comentário enviado por albfneto em 22/08/2013 - 07:34h

Mais uma Dica excelente, favoritada!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts