ubuntu image-processing imagemagick diff

ubuntu - ImageMagick compare: Ignore las coincidencias blancas del resultado PSNR



image-processing diff (2)

Estoy usando compare para diferenciar dos archivos PNG de color similar. Obtienen un valor de PSNR de ~ 27.

Las imágenes contienen muchas áreas blancas que siempre coincidirán entre las dos imágenes. Corrígeme si estoy equivocado, pero estas áreas blancas están aumentando los valores de PSNR (haciendo que las imágenes sean más similares como promedio). Por lo tanto, no quiero tener en cuenta los píxeles blancos, SI coinciden.

¿Hay alguna manera de hacer esto usando compare o teniendo en cuenta alguna otra herramienta?

Intenté configurar -transparent-color en blanco, pero esto no tuvo ningún efecto.

Aquí está mi comando:

compare -compose src -metric PSNR img1.png img2.png diff.png

Editar:

compare --version Version: ImageMagick 6.6.9-7 2014-03-06 Q16 http://www.imagemagick.org convert --version Version: ImageMagick 6.6.9-7 2014-03-06 Q16 http://www.imagemagick.org

Mi idea de ignorar los píxeles blancos puede ser una basura, pero aún quiero lograr una mejor comparación.

Para aclarar:
Imagine esta situación: compara dos imágenes, difieren un poco. A continuación, agrega un borde blanco grande a esas imágenes. Usted vuelve a difamar y descubre que el valor de PSNR resultante ha aumentado un poco. Lo que quiero es una forma de negar esto. Obviamente, los bordes blancos son los mismos en ambas imágenes ...


Actualizado

Bien, ¿qué tal si hacemos una máscara de las áreas en las que quieres que se comparen primero? Por lo tanto, si desea ignorar áreas donde ambas imágenes son blancas, puede hacer esto:

convert a.png b.png / -colorspace gray / -compose multiply -composite / -threshold 65534 / -negate PNG8:mask.png

Luego, cuando hagas tu comparación, enmascara las imágenes de antemano:

convert /( a.png mask.png -compose copy-opacity -composite /) / /( b.png mask.png -compose copy-opacity -composite /) / -metric PSNR -compare diff.png

o con compare así en bash:

compare -metric PSNR / <(convert a.png mask.png -compose copy-opacity -composite PNG:-) / <(convert b.png mask.png -compose copy-opacity -composite PNG:-) / diff.png

Todavía no veo lo que estás tratando de hacer, y aún me gustaría ver tus imágenes y el resultado que esperas ... sin embargo, he seguido tu consejo e hice dos imágenes similares de esta página con las dos letras de la palabra missing blanco.

a.png

b.png

Entonces, si ahora los comparo, entiendo esto:

convert a.png b.png -metric PSNR -compare -format "%[distortion]" info: 33.4539

y esta imagen:

o si hago lo que dije, obtengo esto:

convert -fill black /( a.png +opaque white /) /( b.png +opaque white /) -metric PSNR -compare -format "%[distortion]" info: 7.25418

y esta imagen:

Pero todavía no sé mucho sobre lo que quiere porque he hecho todo el trabajo y no me ha respondido.

Respuesta original

Sería mejor si pudieras publicar tus imágenes para que podamos ver lo que quieres decir, pero intenta usar convert así para hacer la comparación:

convert a.png b.png -metric PSNR -compare diff.png

luego puede agregar un procesamiento previo como este para hacer que todas las áreas blancas sean negras antes de comparar. También puede agregar -fuzz 10% para capturar colores casi blancos.

convert -fill black /( a.png +opaque white /) / /( b.png +opaque white /) / -metric PSNR -compare diff.png


Como Mark Setchell, no entiendo completamente cuál es tu verdadera intención. No proporciona ningún (enlace a) imágenes de muestra que puedan ayudarnos a comprender lo que está haciendo.

Preparación

Es por eso que creé 4 imágenes de muestra. Aquí está el primer par:

  • El izquierdo es un JPEG.
  • El correcto es un PNG.

Las diferencias son mínimas: apenas podrás verlas a simple vista cuando se reproduzcan aquí. Ambas imágenes son 482x642 píxeles:

Aquí viene el segundo par. De nuevo,

  • el izquierdo es un JPEG;
  • el correcto es un PNG.

Ambos se amplían a 1002x1002 píxeles al agregar un marco blanco alrededor del par inicial. En la siguiente reproducción, parecen más pequeños debido a las diferentes escalas dentro de esta página web:

Entonces, las partes "importantes" del segundo par son lo que está contenido en los marcos negros. Los marcos blancos en el límite externo son idénticos.

Comparación

Ahora permitamos comparar ambos pares. Pero no quiero limitar las comparaciones solo a la métrica PSNR. Quiero ver todas las métricas disponibles. Podemos enumerar las métricas disponibles con este comando:

compare -list metric AE Fuzz MAE MEPP MSE NCC PAE PHASH PSNR RMSE

Mi comando para devolver las métricas para el primer par es este:

for metric in $(compare -list metric) ; do / echo -n "Metric ${metric} : " ; / compare / -metric ${metric} / http://i.stack.imgur.com/TEjAd.jpg / http://i.stack.imgur.com/p8JsE.png / null: ; / echo ; / done

Aquí está el resultado (ligeramente reformateado) para el primer par ( solo parte "importante" ):

Metric AE : 123789 Metric Fuzz : 948.522 (0.0144735) Metric MAE : 381.318 (0.00581854) Metric MEPP : 3.5399e+08 (0.000209349, 0.32549) Metric MSE : 13.7285 (0.000209483) Metric NCC : 0.998307 Metric PAE : 21331 (0.32549) Metric PHASH : 5.43771 Metric PSNR : 36.7885 Metric RMSE : 948.522 (0.0144735)

Mi comando para devolver las métricas para el segundo par es este:

for metric in $(compare -list metric) ; do / echo -n "Metric ${metric} : " ; / compare / -metric ${metric} / http://i.stack.imgur.com/gBruS.jpg / http://i.stack.imgur.com/8NJeB.png / null: ; / echo ; / done

Aquí está el resultado (ligeramente reformateado) para el segundo par ( diferencias "diluidas" por marco blanco masivo agregado ):

Metric AE : 133609 Metric Fuzz : 611.952 (0.00933779) Metric MAE : 143.849 (0.00219499) Metric MEPP : 4.33273e+08 (8.71895e-05, 0.341176) Metric MSE : 5.71428 (8.71944e-05) Metric NCC : 0.998137 Metric PAE : 22359 (0.341176) Metric PHASH : 0.360076 Metric PSNR : 40.5951 Metric RMSE : 611.952 (0.00933779)

Aquí están ambos resultados en una tabla común:

+==============+=======================================+=========================================+ | Metric Type | Results for "important" image parts | Results including "unimportant" frames | +==============+=======================================+=========================================+ | Metric AE | 123789 | 133609 | | Metric Fuzz | 948.522 (0.0144735) | 611.952 (0.00933779) | | Metric MAE | 381.318 (0.00581854) | 143.849 (0.00219499) | | Metric MEPP | 3.5399e+08 (0.000209349, 0.32549)| 4.33273e+08 (8.71895e-05, 0.341176)| | Metric MSE | 13.7285 (0.000209483) | 5.71428 (8.71944e-05) | | Metric NCC | 0.998307 | 0.998137 | | Metric PAE | 21331 (0.32549) | 22359 (0.341176) | | Metric PHASH | 5.43771 | 0.360076 | | Metric PSNR | 36.7885 | 40.5951 | | Metric RMSE | 948.522 (0.0144735) | 611.952 (0.00933779) | +==============+========================================+=========================================+

Nota: la comparación de dos imágenes idénticas con la métrica PSNR daría como resultado un valor inf (infinitivo).

Ahora saca tus propias conclusiones ...

Discusión

Comprender las métricas de comparación no es un asunto directo.

Tu propia comprensión del PSNR parece estar un poco desajustada, por la forma en que interpreto tu '' Edición '' :

Para aclarar:
Imagine esta situación: compara dos imágenes, difieren un poco. A continuación, agrega un borde blanco grande a esas imágenes. Usted vuelve a difamar y descubre que el valor de PSNR resultante ha aumentado un poco.

¡Porque un valor creciente para PSNR significa que las dos imágenes comparadas se han vuelto un poco más idénticas entre sí! (Por supuesto, su intención de eliminar marcos / bordes blancos (o de otro color) alrededor de las imágenes antes de compararlos sigue siendo un enfoque razonable. Para ver cómo hacerlo, vea el final de mi respuesta ...)

Para tener una mejor idea de las métricas de comparación de imágenes, primero debe crear unas simples "imágenes". Luego comienza a experimentar con estos.

Aquí hay una sugerencia de cómo crear una serie de "parches" monocolor, con un tamaño de 100x100 píxeles cada uno:

for col in black white blue green red; do / convert -size 100x100 xc:${col} xc-100px-${col}.png ; / done

Tarea experimental: compare cada parche de 100x100 píxeles uno contra el otro.
Preguntas:

  • ¿Qué es notable si yuxtapone las métricas "blanco y negro" contra las métricas "negro-azul" o "rojo-verde"?
  • ¿Algunos resultados son inesperados? ¿Porque?

Ahora haz lo mismo para los parches con 200x200 píxeles:

for col in black white blue green red; do / convert -size 200x200 xc:${col} xc-200px-${col}.png ; / done

Tarea experimental: compara cada parche de 200x200 píxeles uno contra el otro.
Preguntas:

  • ¿Las respectivas métricas de "color1-color2" para las imágenes de 200x200 se desvían de las mismas métricas de "color1-color2" de las imágenes de100x100?
  • ¿Hay algunas métricas que devuelven resultados idénticos a sus contrapartes respectivas? ¿Porque?

Ahora agregue un marco rojo de 50 píxeles de ancho alrededor de cada uno de los parches de 100x100 píxeles. Las imágenes resultantes también serán de tamaño 200x200 píxeles:

for img in xc-100px-*.png ; do / convert / ${img} / -mattecolor red / -frame 50x50 / redframed-${img} ; / done

Tarea experimental: crea tus propios pares de comparación. (También puede comparar parches "monocromáticos" de 200x200 píxeles contra parches "redframed" de 200x200 píxeles ...)
Preguntas:

  • ¿Cuáles son comparaciones razonables?
  • ¿Sabía que el -metric phash es el único que le permite comparar imágenes con diferentes dimensiones ( ancho x alto )?

Cómo "recortar" un marco monocromático alrededor de las imágenes

Puede eliminar cualquier "marco" alrededor de una imagen compuesta por píxeles de colores idénticos. El operador de imagen -trim lo logrará automáticamente. (Funciona también para colores diferentes al blanco).

convert reframed-xc-100px-blue.png -trim +repage output.png identify redframed-xc-100px-blue.png output.png redframed-xc-100px-blue.png PNG 200x200 200x200+0+0 8-bit sRGB 3c 322B 0.000u 0:00.000 output.png[1] PNG 100x100 100x100+0+0 8-bit sRGB 2c 285B 0.000u 0:00.000