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.
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.
images
. Luego, debe verificar si estas sumas de verificación son las mismas.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.png
pero estas sumas de verificación son diferentes.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?
> 0.95
mejor que == 1
compensar los artefactos de compresión en caso de compresión con pérdida?== 1
es correcto.El estado de salida de ImageMagick compare -metric AE
es distinto de cero si al menos un color de píxel es diferente.
Supongamos que tiene una carpeta con el nombre before
que contiene imágenes originales y una carpeta after
que 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;
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%.
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 .
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\}//'
Cristian Ciupitu
sashoalm