Como fazer diff entre duas imagens

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

[ Hits: 8.061 ]

Blog: https://mestrefabio.com

 


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

Como copiar arquivos mantendo a estrutura de diretórios e sub-diretórios

Vim - como executar uma linha do texto no terminal

Como gerenciar sua conta Twitter via linha de comando

Como instalar versões antigas de aplicativos no Android

Google Authenticator no terminal Linux

Leitura recomendada

Como escrever em arquivos protegidos usando o sudo e redirecionamento

Receber e-mail quando o root logar via SSH

Limpando o .recycle do Samba

Testando se a conexão com a internet está ativa

Como trocar senhas de usuários dentro de um 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