¿Cómo puedo saber exactamente qué cambió entre dos imágenes?

28

Por ejemplo, para una conversación reciente sobre compresión JPEG , quería comparar píxel por píxel lo que cambió entre dos JPEG (uno con nivel de compresión 100 y otro con nivel de compresión 95).

¿Cómo genero buenos mapas visuales de lo que cambió sin tediosa programación de software personalizado?

cabbey
fuente
2
No enviar esto como respuesta ya que probablemente no sea una solución viable para las fotos, pero GitHub (el sitio de un programador) tiene algunas formas interesantes de comparar imágenes: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Intente hacer clic "2-up", "Swipe", "Onion Skin" y "Difference".
Henrik N

Respuestas:

35

Photoshop + Capas FTW. (Sí, también puedes usar Gimp o cualquier otro software de edición con las mismas funciones).

Comience con su imagen base, en el caso anterior, utilicé la imagen jpeg quality 100.

  1. crear una nueva capa encima
  2. pegue la segunda imagen en esa capa
  3. establezca el estilo de capa en "diferencia" (vea la flecha rosa izquierda en la primera imagen a continuación)
  4. crear una capa de efecto encima de eso (Capa> Nueva capa de ajuste> Umbral)
  5. establezca el efecto en el umbral (vea la flecha rosa derecha en la primera imagen a continuación)
  6. establecer el valor umbral a 1

En la imagen resultante, cualquier píxel que sea diferente entre las dos imágenes será blanco. Puede ajustarlo para permitir que las cosas sean "un poco diferentes" alterando el valor del umbral.

Ejemplo que muestra MUCHA diferencia entre jpeg 92 y 100 de Lightroom. comparando jpeg 92 y 100 de LR con capas de Photoshop

Ejemplo que no muestra ninguna diferencia entre 95 y 100. comparando jpeg 95 y 100 de LR con capas de Photoshop

No solo se trata de mostrar un "cambio o no" binario, ¿qué pasa si desea más detalles sobre cuánto cambió, por ejemplo, por canal de color?

  1. reemplace la capa de ajuste de umbral con una capa de ajuste de curvas.
  2. editar la curva
  3. encienda el recorte del espectáculo
  4. agarra la manija blanca de entrada debajo de la esquina inferior derecha y arrástrala hacia la izquierda, tan lejos como puedas
  5. retroceda lentamente hacia la derecha hasta que no vea ningún recorte (la imagen de vista previa es toda negra)
  6. apague el recorte y guarde el cambio de curva

Cuanto más brillantes son los píxeles resultantes, más diferentes son en ese color. Sin embargo, la desventaja es que terminas con mucho barro gris ... así que a veces es más fácil limitarlo para ver dónde están las diferencias. Es por eso que construyo ambos y alterno cuál es visible.

Vista más descriptiva de la diferencia

cabbey
fuente
Pregunta de Newb, pero ¿cómo haces el paso 4, "crear una capa de efecto encima de eso"? No puedo encontrarlo en ningún lado. También han pasado 7 años y estoy usando la última versión para que tal vez también hayan cambiado el nombre.
whitneyland
14

Si usa Photoshop, así es como lo haría:

Coloque las dos jpegs en el mismo archivo psd, en dos capas separadas. Deben superponerse exactamente, ya que sus dimensiones son las mismas. (cuál va arriba no importa).

Establezca el modo de fusión de capas en "Diferencia". Verías un resultado mayormente negro. Depende de la diferencia de calidad entre las dos capas originales, puede ver más o menos ruido.

ingrese la descripción de la imagen aquí

Jin
fuente
La diferencia por sí sola no ayuda mucho cuando te quedas con un gran vacío negro como ese. :)
cabbey
@cabbey seguro, comparando 100% a 95% lo más probable es que obtenga un negro sólido. Pero eso es lo que preguntaba, ¿no? En la respuesta de su propietario, está cambiando los valores de los originales que se comparan, lo que hace que ya no tengan la configuración de compresión original.
Jin
Obtienes un negro prácticamente sólido en casi cualquier comparación, porque las diferencias son muy pequeñas. La capa de umbral / curva después de la diferencia no hace nada a la configuración de compresión, solo ayuda a la visualización de los límites inferiores de esa sopa negra que esa diferencia preparó. (No estoy 100% seguro de lo que quisiste decir con eso, así que podría estar yendo en una dirección diferente allí ...)
cabbey
@cabbey si está pidiendo una operación puramente en bits de la diferencia entre las 2 imágenes, entonces el modo de fusión "Diferencia" solo le da eso. Cuando ajusta el umbral / curva, aunque el resultado es más obvio a simple vista, pero no es una representación precisa de lo que ha cambiado. Cuando haces eso, ya no estás comparando un 100% a un 95%.
Jin
Seguro que eres. El nivel de compresión dejó de importar si el segundo photoshop cargaba la imagen del disco en sus buffers internos, ahora es una matriz de píxeles sin comprimir en la memoria ... si esos píxeles llegaron allí porque la imagen tenía una gota cuadrada allí o porque son un artefacto del nivel de compresión no es relevante.
cabbey
13

Todos los paquetes de procesamiento de imágenes deberían facilitar esto. Le mostraré cómo hacerlo en Mathematica, si tiene acceso a este sistema. Mathematica es un lenguaje de programación, pero es realmente fácil hacer este tipo de manipulaciones, por lo que si tiene acceso a él (por ejemplo, a través de una licencia universitaria), ¡le recomiendo que lo pruebe!

Primero, importe la imagen:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Recomprimirlo usando compresión JPEG

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Gráficos de Mathematica

Ahora tome la diferencia de los valores de píxeles, convirtiéndolos primero en números de punto flotante para garantizar que se conserven los valores negativos.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Gráficos de Mathematica

No se ve mucho en la imagen de diferencia (la diferencia es pequeña), y los valores negativos se recortan en negro. Entonces, cambiemos la escala de todos los valores para llenar todo el rango dinámico (el mínimo se escalará a 0, el máximo a 1):

ImageAdjust[diff]

Gráficos de Mathematica

ImageDifferenceda la diferencia absoluta de las dos imágenes y no produce números negativos. Esta es la operación que es más probable que encuentre en los paquetes de procesamiento de imágenes, especialmente los GUI (Photoshop, GIMP).

ImageDifference[img, img2]

Gráficos de Mathematica

También podemos tomar un solo canal RGB, por ejemplo el rojo, y visualizar las diferencias positivas y negativas usando colores 'opuestos':

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Gráficos de Mathematica

Aquí está lo mismo, con las diferencias amplificadas 5 veces. Los artefactos JPEG ahora son más reconocibles.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Gráficos de Mathematica

La ventaja de usar un lenguaje de programación es que podemos automatizarlo fácilmente y ver cómo cambia la diferencia para los "niveles de compresión" entre 0.1 y 1.0:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Gráficos de Mathematica

Szabolcs
fuente
¡Siempre es bueno ver una opción programada / automatizada! :)
jrista
5

Puede usar las herramientas de línea de comandos de Imagemagick.

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

proporcionará el valor absoluto de las diferencias para cada canal RGB.

mikael
fuente
0
  1. Abra una de las imágenes en GIMP o Photoshop.
  2. Agregue la segunda imagen como una nueva capa encima de la primera.
  3. Establezca el modo de fusión de la capa superior en "Diferencia"

En la imagen resultante, las partes negras muestran dónde las imágenes originales son idénticas y cualquier cosa más clara muestra diferencias.

Dan
fuente
La diferencia por sí sola no ayuda mucho cuando te quedas con un gran vacío negro como ese. :)
cabbey
Siempre puede ajustar los niveles en la imagen resultante. Cada vez que he usado esta técnica, he tenido imágenes lo suficientemente diferentes como para poder ver los cambios :)
Dan