Herramienta de línea de comandos para comprobar si dos imágenes son exactamente iguales gráficamente

Necesito una herramienta de línea de comandos que compare 2 imágenes y diga si su contenido es el mismo, independientemente de la codificación, es decir, uno podría ser * .bmp y el otro podría ser * .png, siempre que todo su ancho, alto y todos los píxeles correspondientes son iguales.

  • Se necesita similitud gráfica exacta
  • La pérdida de compresión, incluso si es casi invisible, crea una imagen diferente
  • La misma transparencia alfa también es importante
  • EXIF/etc. irrelevante
Solo para aclarar, los metadatos (por ejemplo, EXIF ) no son relevantes, ¿verdad?
@CristianCiupitu Sí, solo que las imágenes se muestran igual en cualquier fondo (es decir, la transparencia alfa es una diferencia).

Respuestas (7)

Con ImageMagick ( apt-get install imagemagick), puede comparar imágenes independientemente de la codificación y metadatos como este:

identify -quiet -format "%#" images...

Tenga en cuenta que las imágenes codificadas con compresión con pérdida como JPEG (*.jpg) tienen cambios sutiles, a menudo invisibles.

Consulte también Ejemplos de ImageMagick: firmas de imagen .

Estrictamente hablando, también debe comparar el modelo de color y la escala de valores de píxeles. Es posible que no formen parte de los metadatos de la imagen.

Gran respuesta. Sin embargo, solo para aclarar: esto imprimirá sumas de verificación concatenadas para cada imagen en images. Luego, debe verificar si estas sumas de verificación son las mismas.
No funciona cuando se comparan dos PNG visualmente idénticos , siendo uno paleta ( 8-bit colormap) y el otro RGBA completo ( 8-bit/color RGBA). No muestran ninguna diferencia con ImageMagick: compare -dissimilarity-threshold 1 palette.png rgba.png difference.pngpero estas sumas de verificación son diferentes.
@int_ua ¡Gracias! ¿Te gustaría hacer una edición para agregarlo como una nota al final? (O debería)
Hágalo, tal vez agregue un enlace a otra respuesta que funcionó en mi caso: softwarerecs.stackexchange.com/a/42004/71752

Si tiene MATLAB, puede usar:

% Reading images as array to variable 'a' & 'b'. 
a = imread('MIMICDatacollection.bmp'); 
b = imread('MIMICDatacollection.png'); 

% Flatten multidimensional arrays to 1D
c=a(:);
d=b(:);

% Perform comparison
if length(c) ~= length(d)
    disp('The images do not have the same size') 
else
    e = corr2(c,d);           
    if e==1 
        disp('The images are same')
    else 
        disp('The images are not same') 
    end; 
end

Personalmente, lo uso con PNG y BMP, pero debería funcionar para cualquier formato compatible con imread.

Si necesita ejecutarlo en una máquina que no tiene Matlab, puede convertirlo en una función y compilarlo para que sea CLI.

Si no tiene Matlab, debería ser fácil de portar a cualquier lenguaje de alto nivel con una biblioteca de imágenes decente, como Python Imaging Library (PIL).

Relacionado: ¿Cómo puedo saber si estoy descargando/guardando imágenes duplicadas?

¿No sería algo > 0.95mejor que == 1compensar los artefactos de compresión en caso de compresión con pérdida?
@vsz No lo he probado, pero suena razonable.
@vsz En realidad, el autor de la pregunta quiere exactamente lo mismo gráficamente, por lo que == 1es correcto.

El estado de salida de ImageMagick compare -metric AEes distinto de cero si al menos un color de píxel es diferente.

Supongamos que tiene una carpeta con el nombre beforeque contiene imágenes originales y una carpeta afterque debe contener imágenes visualmente idénticas con el mismo nombre de archivo. Usando ImageMagickcompare , puedes hacer esto:

for file in before/*.png; do
    result=$(compare -metric AE "${file}" "${file/before/after}" /tmp/diff.png 2>&1);
    if [ "${result}" != '0' ]; then
        echo "${result} incorrect pixels in ${file}";
    fi;
done;
¿Funciona esto en imágenes de bioformato como .TIF o .NDPI hasta donde sabe?
Encontré mi respuesta aquí: imagemagick.org/script/formats.php . Entonces, el primer paso, que al final también es lo suficientemente rápido para mis propósitos, es convertir a png pequeño y compararlos.

findimagedupes - Encuentra imágenes visualmente similares o duplicadas

findimagedupes es una utilidad de línea de comandos que realiza una "diferencia visual" aproximada de dos imágenes. Esto le permite comparar dos imágenes o un árbol completo de imágenes y determinar si alguna es similar o idéntica. En los tipos de imágenes comunes, findimagedupes parece tener una precisión de alrededor del 98%.

Desafortunadamente, no funciona para mi caso, ya que informa imágenes visualmente similares (pero no iguales) como duplicados. Necesito que verifique los resultados de las pruebas automatizadas, por lo que se necesita la similitud exacta, no solo la similitud.

Eventualmente creé un pequeño programa Qt al que llamé imgdiff, que toma 2 nombres de archivo y realiza una comparación píxel por píxel. Imprimirá un mensaje de error si difieren y saldrá con 1, o saldrá silenciosamente con 0 si son iguales.

Ejemplo de uso sería:

imgdiff img1.png img2.bmp

Enlace al proyecto Google Code - https://code.google.com/p/imgdiff/ .

Prueba dupeguru desde aquí: https://dupeguru.voltaicideas.net/ . En el modo Imagen, busca imágenes similares, aunque tengan diferentes tamaños, tiene una configuración de umbral, crea grupos de archivos similares y elige el archivo más grande como principal, pero también se puede configurar otro archivo como referencia. Es capaz de mover archivos a alguna ruta oa la papelera de reciclaje o eliminarlos por completo. Es multiplataforma.

Otra herramienta interesante, que también se puede usar para varias operaciones de combinación, es WinMerge: https://winmerge.org/ . Tiene una característica interesante que resalta las áreas de diferencia en las imágenes, pero puede comparar hasta tres archivos a la vez, o tres rutas que contienen archivos, pero compara los archivos que tienen el mismo nombre solo, si se encuentran en esas rutas. Esto es bueno para la sincronización de carpetas. Esto es solo para Windows, funciona bien en Wine, pero hay una versión QT disponible que parece estar en una etapa temprana: https://github.com/OzzieIsaacs/winmerge-qt .

¿Puede agregar detalles sobre las características relevantes de dicho software?

Es posible que necesite ajustes para manejar el canal alfa de manera adecuada, pero la conversión a ppm y la suma de verificación parecen funcionar:

#!/bin/bash

find "${@:-.}" -type f -print |\
while IFS= read -r file; do
    hash=$(convert 2>&- "${file}" -strip ppm:- | md5sum) 
    # we get this hash if convert fails and produces no output
    [ "$hash" = 'd41d8cd98f00b204e9800998ecf8427e  -' ] \
    || echo "$hash ${file}"
done |\
sort | uniq -w32 --all-repeated=separate | sed 's/^.\{36\}//'