Como fazer diff entre duas imagens

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

[ Hits: 8.770 ]

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

Instalando o VirtualBox no Debian 10 Buster

Erro: "Possible missing firmware... for module r8169" [Resolvido]

Convertendo arquivos em PDF no Vim

Belo Horizonte é sede de amplo debate sobre conhecimento livre

Como instalar Deno no Linux

Leitura recomendada

Filtrando sites navegados por máquinas no log do Squid

Sockets em shell script

Realizar cópia mantendo mesma permissão da pasta

Como criar um cronômetro em modo texto

SSH simultâneo para vários servidores

  

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