"Diff" una imagen usando ImageMagick


¿Cómo puedo obtener la diferencia entre dos imágenes? Tengo la imagen original. Alguien ha escrito en un duplicado exacto de la imagen original. Ahora, necesito comparar el original con el escrito en la imagen y extraer solo la escritura en formato de imagen.

Ejemplo: tengo una foto de una casa. Alguien tomó una copia y escribió " Hola!"en la copia. Quiero comparar de alguna manera las dos imágenes, quitar la casa, y quedar con una imagen de las palabras " Hola!".

Es esto posible con ImageMagick? Sé que hay maneras de obtener la diferencia estadística entre imágenes, pero eso no es lo que estoy buscando.

Author: MvG, 2011-02-27

2 answers

Mis propios favoritos son estos dos:

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf

La única diferencia entre los 2 comandos anteriores: el primero muestra la diferencia visual entre las dos imágenes como un archivo PNG, el segundo como un PDF.

El archivo diff resultante muestra todos los píxeles que son diferentes en color rojo. Los que no han cambiado aparecen blancos.

Corto y dulce.

Nota, tus imágenes necesitan no sé del mismo tipo. Incluso puede mezclar JPEG, TIFF, PNG under en una condición: las imágenes deben ser del mismo tamaño (dimensión de la imagen en píxeles). El formato de salida está determinado por la extensión del nombre de archivo de salida.

Si, por alguna razón, necesita una resolución más alta que la predeterminada ( 72 dpi) add entonces simplemente agregue un parámetro -density apropiado:

 compare -density 300 image1 image2 -compose src diff.jpeg

Ejemplos ilustrados

Aquí hay algunas ilustraciones de los resultados de las variaciones del comando anterior. Nota: los dos archivos comparados fueron incluso PDF archivos, así que funciona con estos también (siempre y cuando sean 1-buscapersonas)!


A la Izquierda: Imagen con texto Centro: imagen Original Derecho: Diferencias (=texto) en píxeles rojos. Solo píxeles de diferencia rojos; los píxeles idénticos son blancos

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

Este es el mismo comando que sugerí anteriormente.


Izquierda: Imagen con texto Centro:Imagen original Derecha: Diferencias en los píxeles 'seagreen'. Solo píxeles de diferencia de Seagreen; los píxeles idénticos son blancos

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

Este comando agrega un parámetro para hacer la diferencia de píxeles 'seagreen' en lugar del rojo predeterminado.


Left: Image with text Center: Original image Right: Blue diffs (but w. some context background) Solo píxeles de diferencia azules; la primera de las imágenes comparadas como un fondo aligerado l

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

Este comando elimina la parte -compose src the el resultado es el comportamiento predeterminado de compare que mantiene como fondo aligerado la primera de las 2 imágenes difusas. (Esta vez con el parámetro añadido para hacer que los píxeles diff aparezcan en azul.)

 273
Author: Kurt Pfeifle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 18:52:29

Mientras que compare hace un buen trabajo para muchas aplicaciones, descubrí que a veces prefiero un enfoque diferente, particularmente cuando se comparan imágenes que en su mayoría son en escala de grises:

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

La idea es la siguiente: convertir ambos file1.png y file2.png a escala de grises. Luego trate el primero como el canal rojo de la imagen resultante, el segundo como el canal verde. El canal azul se forma a partir de estos dos usando el operador darken compose, que esencialmente significa tomar el mínimo.

Así que las cosas que son blancas en ambas imágenes permanecen blancas. Las cosas que son negras en ambas imágenes permanecen negras. Las cosas que son blancas en la primera imagen pero negras en la segunda se vuelven rojas, y las cosas que son blancas en la segunda pero negras en la primera se vuelven verdes.

El resultado le da una imagen bien codificada por colores donde puede asociar fácilmente el verde con la primera entrada y el rojo con la segunda. Aquí hay un ejemplo donde estoy usando esto para comparar la salida de LaTeX con la de KaTeX (antes de que corregido un error para hacer esto mejor):

introduzca la descripción de la imagen aquí

Puede combinar los enfoques, usando compare para ver dónde algo cambió y luego usando lo anterior para ver con más detalle cómo cambió.

 42
Author: MvG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-16 12:23:46