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):