Como fazer diff entre duas imagens

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

[ Hits: 8.558 ]

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

Ouvindo rádios online com o mpg123

Logitech Marble Mouse

Agendando tarefas com Python (schedule)

Contagem regressiva no terminal

Meu servidor Conectiva Linux se conecta, mas não encontra sites na Internet

Leitura recomendada

Configurar Gedit para compilar e executar scripts em PASCAL

Como Habilitar Facilmente Shell Script WEB no Linux Mint - Servidor Apache

Kernel for Newbies - seu assistente de compilação do Kernel em 10 simples passos

Como criar e manter um mirror do Slackware em seu próprio micro

Como contornar o erro -bash: 08: value too great for base (error token is "08")

  

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