Como fazer diff entre duas imagens

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

[ Hits: 5.891 ]

Blog: https://fabio.city

 


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

Ferramentas CASE para Linux

Criando um programa CGI com Perl

Como limpar o cache DNS no Google Chrome

Skype Call Recorder - Como gravar áudio de chamadas do Skype

Criando um despertador usando crontab e mpg123

Leitura recomendada

Bloqueando Facebook com IPtables (de forma fácil, intuitiva e eficiente)

Passagem de parâmetros para funções shell script

Criando um arquivo .tar auto-instalável

Variável para guardar o nome do Script

Redimensionando e renomeamento imagens em massa

  

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
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts