"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.
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.
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'.
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) 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.)
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):
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ó.
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