"Difundir" una imagen usando ImageMagick

178

¿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 quedarme con una imagen de las palabras "¡Hola!".

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

Justin Noel
fuente
8
¡Prueba esta sección de la guía de uso de ImageMagick!
Benoit
1
Sé que esta pregunta es sobre ImageMagick, pero solo tuve que incluir un enlace a Resemble.js para el buscador "causal" que podría estar buscando una solución agnóstica.
brichins
¿Alguien sabe de una herramienta que comparará 2 imágenes restando los píxeles de la segunda imagen, de la primera? Prefiero no escribir el mío.
MarcusJ
Imagemagick 7 tiene hash perceptual, una técnica que utiliza momentos de imagen invariables. es agradable en el sentido de que tiene el mismo efecto incluso después de la rotación, distorsión de barril, cambio de tamaño, cambio de gamma, introducción de ruido, marca de agua ...
v.oddou
1
@ v.oddou, gracias. Leí documentos e hice algunas pruebas más. Parece funcionar mal con dibujos lineales que están muy poco poblados y con una densidad de píxeles extremadamente baja. Parece que la densidad de píxeles es la clave en PHASH para identificar similitudes.
BReddy

Respuestas:

320

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.

Tenga en cuenta que sus imágenes no necesitan ser del mismo tipo. Incluso puede mezclar JPEG, TIFF, PNG, bajo 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 ppp), simplemente agregue un -densityparámetro apropiado :

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

Ejemplos ilustrados

Aquí hay algunas ilustraciones de resultados para variaciones del comando anterior. Nota: los dos archivos comparados eran incluso archivos PDF , por lo que también funciona con estos (¡siempre y cuando sean de 1 página!)


Izquierda: imagen con texto       Centro: imagen original       Derecha: diferencias (= texto) en píxeles rojos. Solo píxeles de diferencia roja;  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 píxeles 'verde marino'. Seagreen diferencia de píxeles solamente;  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 que la diferencia de píxeles sea 'verde marino' en lugar del rojo predeterminado.


Izquierda: imagen con texto       Centro: imagen original       Derecha: diferencias azules (pero con algún fondo de contexto) Solo píxeles de diferencia azul;  primero de las imágenes comparadas como fondo iluminadol

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

Este comando elimina la -compose srcparte; el resultado es el comportamiento predeterminado compareque mantiene como fondo claro la primera de las 2 imágenes difusas. (Esta vez con el parámetro agregado para que los píxeles de diferencia aparezcan en azul).

Kurt Pfeifle
fuente
¿No puedo entender de dónde vino este cli de comparación? ¿Es parte de imagebrick? disponible en windows?
Krishnom
2
@ Krishnom: No existe tal cosa como 'imagebrick'. ¿Te refieres a ImageMagick?
Kurt Pfeifle
2
@ Krishnom: la pregunta explícita sobre una solución de ImageMagick. Parte del paquete de software v6.x de ImageMagick tenía una herramienta CLI separada llamada 'compare'. Para v7.x de ImageMagick, debe ejecutar en su 'magick compare'lugar.
Kurt Pfeifle
Culpa mía. Gracias por corregir eso (imagebrick -> imageMagick). Voy a darle una oportunidad. También estoy buscando una herramienta para comparar imágenes a granel. Gracias por la ayuda nuevamente
Krishnom
@ Krishnom: No sé qué es una "imagen masiva". Pero todavía apuesto a que el conjunto de herramientas ImageMagick puede hacer lo que quieras.
Kurt Pfeifle
53

Si bien comparehace un buen trabajo para muchas aplicaciones, descubrí que a veces prefiero un enfoque diferente, particularmente al comparar imágenes que son en su mayoría 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.pngy file2.pngen escala de grises. Luego, identifique 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 utilizando el darkenoperador de composición, lo que esencialmente significa tomar el mínimo.

Entonces 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 brinda 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 en el que estoy usando esto para comparar la salida de LaTeX con la de KaTeX (antes de corregir algún error para mejorar esto):

ingrese la descripción de la imagen aquí

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

MvG
fuente
2
¡Agradable! Necesitaba algo de interacción, así que repliqué tu método en Gimp. Como referencia: 1) cargar imágenes como capas, 2) Color -> Desaturar ambas capas, 3) eliminar canales alfa de ambas capas en la pestaña Capas, 4) seleccionar los canales G + B en una capa, seleccionar todos y borrar los canales con color negro, lo mismo con los canales R + B en la segunda capa, 4) configure el modo de pantalla para la capa superior en la pestaña Capas.
Matěj Šmíd
1
@Palmstrom: ¡Gracias! Originalmente hice estas comparaciones de imágenes usando Gimp, pero lo hice usando el modo de capa "extracto de grano" directamente en las imágenes de entrada, por lo que las áreas comunes terminarían en gris, mientras que la diferencia sería negra en una dirección y blanca en la otra . Más difícil de leer, pero más rápido de generar, y puede contener información de color. Supongo que coincidiría aún más con mi comando si estuviera usando "oscurecer solamente" en lugar de "pantalla", y coloree los canales no utilizados en blanco en lugar de negro.
MvG
1
Algunas entradas de PDF dan como resultado una imagen invertida después de la conversión en escala de grises por algún motivo. Usar en -colorspace graylugar de -grayscale Rec709Luminancearregla eso, pero esto arruina la composición. Agregue -respect-parenthesescomo la primera opción para convertocuparse de eso.
Brecht Machiels
Aquí hay un script para diferenciar visualmente dos PDF página por página utilizando este método: gist.github.com/brechtm/891de9f72516c1b2cbc1 . Produce un JPG por cada página de los PDF en un pdfdiffdirectorio e imprime adicionalmente los números de las páginas que difieren entre los dos PDF.
Brecht Machiels
1
En ImageMagick v6.7.7-10 parece -grayscaleque no es compatible, tuve que usar -colorspace graycomo sugirió
@BrechtMachiels