visual imagenes comparar como c# c++ image image-processing imagemagick

c# - imagenes - ¿Podemos comparar mediante programación diferentes imágenes de las mismas resoluciones?



como comparar dos imagenes en visual basic (1)

¿Existe una manera buena y confiable de comparar imágenes del mismo formato y la misma resolución y obtener una diferencia entre ellas?

En el mejor de los casos, estoy buscando una representación numérica de la imagen que pueda compararse porque tengo que comparar muchas imágenes.


Puedes usar el comando de compare de ImageMagick para hacer esto.

(Si tiene éxito con la línea de comandos, podría pasar a utilizar una de las API de ImageMagick: estos están, entre otros, disponibles para C ( ''MagickWand'' ), C++ ( ''Magick ++'' ), Java ( ''JMagick'' ) , LISP ( ''L-Magick'' ), .NET ( ''Magick.NET'' ), Perl ( ''PerlMagick'' ), PHP ( ''IMagick'' ), Python ( ''PythonMagick'' ) y Ruby ( ''RMagick'' ). Luego, implemente las funciones respectivas en una aplicación propia.)

El único requisito es: las imágenes deben tener dimensiones idénticas en anchura y altura, medidas en el número de píxeles. Así que ni siquiera necesita el mismo formato que asumió.

La diferencia puede ser devuelta de diferentes maneras:

  • Genere una representación visual de las diferencias, donde el píxel con deltas se resalta de alguna manera en una imagen delta.

  • Genere una representación textual y / o estadística de las diferencias, donde la salida es uno o varios números, o simplemente el conteo de píxeles que son diferentes, o alguna otra métrica.

Ejemplo

Aquí hay cuatro imágenes de ejemplo que se pueden comparar. Todos tienen una apariencia similar, tienen un tamaño de 322x429 píxeles, pero existen algunas diferencias más finas en cuanto a coloración y formato: la superior derecha es un JPEG, las otras tres son PNG:

Comparaciones visuales

Este es el comando más simple para comparar las dos imágenes principales y producir un ''delta'' visual:

compare / http://i.stack.imgur.com/GBax7.png / http://i.stack.imgur.com/D9IAV.jpg / delta1.pdf

Esto compara un PNG con el JPEG y produce un PDF como salida. Para obtener una impresión visual de esta salida, vea la imagen de abajo a la izquierda (ya que los PDF no se pueden mostrar aquí, recurrí a producir un PNG y usé esto para la visualización).

¿Qué hizo exactamente este sencillo de todos los comandos de compare ImageMagick?

  1. Utilizó la primera imagen como fondo pálido.
  2. Se superpusieron píxeles rojos y completamente opacos en cada ubicación donde el color del píxel respectivo en la segunda imagen se desvía de la primera.

(Podría haber agregado -highlight-color blue y el -lowlight-color yellow o cualquier otra definición de color si no quisiera el resaltado rojo predeterminado)

¿Qué pasaría si no quisiera una comparación tan exacta de los colores de píxeles? ¿Qué sucede si me gustaría un píxel rojo solo cuando hay una distancia de color más considerable entre los píxeles respectivos?

Fácil: ¡agregue un factor ''fuzz'' a la línea de comando!

compare / http://i.stack.imgur.com/GBax7.png / http://i.stack.imgur.com/D9IAV.jpg / -fuzz 2.5% / delta2.png

Cuando se ejecuta sin argumentos adicionales el primer comando de comparación (el más simple), ImageMagick agregó en silencio una especificación de su método de comparación predeterminado, que se llama -compose src-over .

Por supuesto, podemos anular esto y usar un modo de composición diferente. ¿Cómo aprender sobre los modos de composición disponibles? El comando convert -list compose los enumerará por nosotros! Aquí está la lista completa: contiene 67 diferentes en mi sistema:

En lo alto blur bumpmap ChangeMask Claro ColorBurn ColorDodge Colorear CopyBlack CopyBlue CopyCyan CopyGreen Copia CopyMagenta CopyOpacity CopyRed CopyYellow Más oscuro DarkenIntensity DivideDst DivideSrc Dst Diferencia Desplazar Disolver Distorsionar DstAtop DstIn DstOut DstOver Exclusión HARDLIGHT HardMix Hue En Aclarar LightenIntensity LinearBurn LinearDodge LINEARLIGHT Luminize Matemáticas MinusDst MinusSrc modulan ModulusAdd ModulusSubtract Multiplicar Ninguno Superposición superpuesta sobre PegtopLight PinLight Plus Reemplazar saturar pantalla SoftLight Src SrcAtop SrcIn SrcOut SrcOver VividLight Xor

Probemos todos y cada uno:

for i in $(convert -list compose|tr "/n" " "); do / compare / http://i.stack.imgur.com/GBax7.png / http://i.stack.imgur.com/D9IAV.jpg / -compose ${i} / delta-${i}.png ; / done

Por supuesto, sería demasiado mostrar ahora todas y cada una de las imágenes delta resultantes. Los más interesantes son los siguientes:

  • arriba a la izquierda es la -compose Difference
  • arriba a la derecha es -compose DivideSrc
  • centro izquierda es -compose CopyBlue
  • centro derecha es -compose MinusDst
  • abajo a la izquierda es -compose Hue
  • abajo a la derecha es -compose LightenIntensity

Nota: si cambia el orden de las dos imágenes comparadas, ¡los dos deltas resultantes podrían ser significativamente diferentes!

Ahora ya puede comenzar sus propios experimentos comparando visualmente dos imágenes similares.

Resultados métricos

Para generar métricas sobre las diferencias de dos imágenes, puede ejecutar un comando como este:

compare / -metric rmse / http://i.stack.imgur.com/GBax7.png / http://i.stack.imgur.com/D9IAV.jpg / null:

rmse es el acrónimo de error cuadrático medio . El resultado de las imágenes de ejemplo anteriores da:

1339.53 (0.02044)

¿Cuántos métodos métricos diferentes son compatibles?

El siguiente comando enumera todos los métodos de métricas de comparación disponibles en un sistema determinado, para la versión actual de ImageMagick:

compare -list metric

En mi cuaderno, estos son:

AE Fuzz MAE MEPP MSE NCC PAE PHASH PSNR RMSE

Los significados de estas abreviaturas son:

AE absolute error count, number of different pixels (`-fuzz` effected) FUZZ mean color distance MAE mean absolute error (normalized), average channel error distance MEPP mean error per pixel (normalized mean error, normalized peak error) MSE mean error squared, average of the channel error squared NCC normalized cross correlation PAE peak absolute (normalized peak absolute) PHASH perceptual hash PSNR peak signal to noise ratio RMSE root mean squared (normalized root mean squared)

Una métrica interesante (y relativamente reciente) es phash (''hash perceptual''). Es el único que no requiere dimensiones idénticas para las dos imágenes comparadas. Realmente es la mejor ''métrica'' para reducir imágenes de aspecto similar (o al menos excluir de manera confiable estos pares de imágenes que se ven muy diferentes) sin realmente "mirarlas", en la línea de comandos y programáticamente.

Un buen experimento para ejecutar es cuando comparas una imagen con ella misma. Muestra cómo la métrica respectiva traduce ''identidad'' a su propio entorno:

for i in $(compare -list metric); do / compare / -metric $i / http://i.stack.imgur.com/GBax7.png / http://i.stack.imgur.com/GBax7.png / null: / done

Este es el resultado:

AE : 0 Fuzz : 0 (0) MAE : 0 (0) MEPP : 0 (0, 0) MSE : 0 (0) NCC : 1.00001 PAE : 0 (0) PHASH : 0 PSNR : inf RMSE : 0 (0)

Como puede ver, cada método métrico único devuelve 0 , aparte de dos: PSNR devuelve infinity y NCC devuelve 1.00001 .

Ejecute este mismo comando y compare un parche blanco puro de 100x100 píxeles con uno negro puro:

for i in $(compare -list metric); do / compare / -metric $i / -size 100x100 / xc:white / xc:black / null: / done

Esto devuelve el siguiente resultado:

AE : 10000 Fuzz : 65535 (1) MAE : 65535 (1) MEPP : 1.96605e+09 (1.00003, 1) MSE : 65535 (1) NCC : 0 PAE : 65535 (1) PHASH : 417.941 PSNR : 0 RMSE : 65535 (1)

La métrica AE es la esperada: 10000 píxeles (de -size 100x100 ) son diferentes. La mayoría de los otros resultados también son fáciles de entender una vez que haya leído y asimilado lo que significan las definiciones de métricas respectivas ...

Finalmente, echemos un vistazo a la salida de cada métrica disponible al comparar las dos imágenes superiores anteriores (PNG y JPEG):

for i in $(compare -list metric); do / compare -metric $i / http://i.stack.imgur.com/GBax7.png / http://i.stack.imgur.com/D9IAV.jpg / null: / done AE : 74200 Fuzz : 1339.53 (0.02044) MAE : 499.997 (0.00762946) MEPP : 2.07206e+08 (0.000417654, 0.435294) MSE : 27.3801 (0.000417793) NCC : 0.99709 PAE : 28527 (0.435294) PHASH : 0.745389 PSNR : 33.7904 RMSE : 1339.53 (0.02044)

¡Ahora escoge tu métrica! :-)