Por ejemplo, para una conversación reciente sobre la compresión JPEG , quería comparar píxel por píxel qué cambió entre dos archivos 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 una tediosa programación de software personalizada?
Photoshop + Capas FTW. (Sí, también puede 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 de calidad jpeg 100.
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.
Ejemplo que no muestra ninguna diferencia entre 95 y 100.
No es solo mostrar un binario "cambiado o no", ¿qué sucede si desea obtener más detalles sobre cuánto cambió, por ejemplo, por canal de color?
Cuanto más brillantes sean los píxeles resultantes, más diferentes serán en ese color. Sin embargo, la desventaja es que terminas con mucho lodo 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.
Todos los paquetes de procesamiento de imágenes deberían hacer esto fácil. 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, así que si tiene acceso a él (por ejemplo, a través de una licencia de sitio universitario), ¡le recomiendo que lo pruebe!
Primero, importa la imagen:
img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]
Vuelva a comprimirlo usando compresión JPEG
img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]
Ahora tome la diferencia de los valores de píxel, convirtiéndolos primero en números de coma flotante para garantizar que se conserven los valores negativos.
diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]
No se ve mucho en la imagen de diferencia (la diferencia es pequeña) y los valores negativos se recortan en negro. Así que 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]
ImageDifference
da 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 de GUI (Photoshop, GIMP).
ImageDifference[img, img2]
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]
Aquí está lo mismo, con las diferencias amplificadas 5 veces. Los artefactos JPEG son más reconocibles ahora.
ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
La ventaja de usar un lenguaje de programación es que podemos automatizar esto 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]
Si usa Photoshop, así es como lo haría:
Coloque los dos jpegs en el mismo archivo psd, en dos capas separadas. Deben superponerse exactamente, ya que sus dimensiones son las mismas. (cuál va en la parte superior no importa).
Establezca el modo de fusión de capas en "Diferencia". Verías un resultado mayormente negro. Dependiendo de la diferencia de calidad entre las dos capas originales, es posible que vea más o menos ruido.
Puede utilizar 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.
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.
GitHub tiene algunas herramientas de comparación de imágenes interesantes integradas en la web, como se describe aquí y se demuestra en esta demostración .
henrik n