¿Cómo puedo ajustar la temperatura de color de una imagen mediante programación?

8

Me pregunto cómo convertir mediante programación (es decir, con un lenguaje de programación en lugar de un editor) de una temperatura de color a otra.

Si, por ejemplo, supongo (y es una gran suposición) que un algoritmo de balance de blancos podría tomar una imagen procesada (p. Ej., JPEG, etc.) y colocar la temperatura general en una escena a 6500, ¿cómo algoritmáticamente "enfriaría" ¿"o" calienta "la escena a una temperatura específica?

Obviamente, esta es una operación común en un programa de edición de imágenes, pero generalmente operan en imágenes RAW que no tienen procesamiento aplicado (manipulación del espacio de color o de otro modo). En el caso de los archivos RAW, ¿quizás los archivos RAW individuales contienen información suficiente (en el encabezado del archivo) con respecto a la calibración del color del sensor de la cámara para hacer que la transformación de temperatura específica sea más determinista?

Por cierto, hice esta pregunta en el Stack Overflow normal y se sugirió que podría obtener una mejor respuesta aquí.

trican
fuente
"[...] ¿quizás los archivos RAW individuales contienen suficiente información (en el encabezado del archivo) con respecto a la calibración del color del sensor de la cámara para hacer que la transformación de temperatura específica sea más determinista?" Si. El ejemplo es para Raw de Canon, por lo que la ubicación difiere un poco de otras marcas.
Jari Keinänen
¡Gracias, fue un enlace muy útil! ¿Aunque todavía no estoy seguro de cómo cambiar de una temperatura de color a otra?
trican
Las imágenes sin procesar siempre se interpretan con algún conjunto de instrucciones de las cuales la información Exif sobre los niveles de balance de blancos RGGB son un aspecto. Los JPG a su vez son imágenes más o menos compuestas en las que toda la información está codificada y las ediciones son destructivas. No puedo proporcionar buenos ejemplos, pero me sumergiría en ImageMagick, que es un editor de imágenes de línea de comandos con varias interfaces de programa. Su -color-matrixopción puede ayudarlo a comenzar; ver también: fmwconcepts.com/imagemagick/whitebalance/index.php
Jari Keinänen
El tipo que respondió en el desbordamiento de la pila respondió correctamente pero con menos detalles. Sugirió una matriz que es matemáticamente equivalente a una ganancia por canal de los valores diagonales fuera de cero.
agf1997

Respuestas:

6

Debería hacer una conversión de punto blanco en el espacio de color en el espacio L * a * b *. La mayoría de los modelos de color con los que normalmente trabajamos, principalmente RGB pero a menudo CMYK, están diseñados para admitir las limitaciones y requisitos del hardware físico. Sin embargo, esos modelos generalmente no representan muy bien el espacio de color "perceptual", y el punto blanco es definitivamente un aspecto perceptivo del color.

Siempre que necesite aplicar ajustes perceptuales a una imagen, como la temperatura del color o los cambios de tinte, es mejor convertirlo de RGB a XYZ, y durante la conversión, puede aplicar "puntos blancos de referencia" para el espacio de color de origen y destino. . La conversión de XYZ a Lab lo lleva a un espacio de color donde puede reasignar perceptualmente el punto blanco y todos los colores para que mantengan la continuidad.

Las conversiones de espacio de color, la adaptación cromática, los ajustes de punto blanco, etc. son bastante complejos matemáticamente. Cuanto más perceptivamente precisa sea su intención, más complejas serán las matemáticas. Se puede encontrar una excelente fuente de información para las conversiones de espacio de color en el sitio web de Bruce Lindbloom . Se puede encontrar información útil adicional en Wikipedia . También puede encontrar útil esta información sobre los iluminadores de la serie D de CIE , ya que contiene información específica de punto blanco, cálculos y constantes.

jrista
fuente
No es necesario ir a un espacio perceptual como CIELAB para realizar un balance de blancos para exposiciones de escenas como las que se encuentran en los datos de la cámara RAW. El balance de blancos es un cambio de exposición por canal en el espacio de exposición de escena lineal. La adaptación cromática se utiliza para ajustar una imagen en función de un supuesto estado de adaptación de los espectadores a un iluminante. Esto también se realiza como una ganancia, pero en el espacio de respuesta de cono (LMS), por lo que producirá un resultado razonable.
agf1997
Cabe señalar que pasar de RAW cameraRGB a XYZ y, en última instancia, CIELAB, uno debe pasar por una matriz de caracterización que ha sido optimizada con un solucionador. Los valores de cameraRGB deben estar correctamente balanceados en blanco para que esta transformación de matriz a XYZ sea precisa y exija que el balance de blancos se realice en el espacio de exposición lineal de la escena.
agf1997
1
Iba a decir que deberías poner eso en una respuesta, pero veo que ya lo hiciste. ¡Gracias por las ideas, sin embargo! No sabía que esto se podía hacer de manera tan simple.
jrista
4

El balance de blancos es una manipulación de procesamiento de imágenes muy sencilla. Es solo una ganancia por canal en el espacio RGB lineal. Los archivos JPG son subóptimos para hacer el balance de blancos, ya que generalmente tienen una curva de tono y un monitor inverso. Es por eso que generalmente se hace comenzando con datos RAW. Si puede obtener valores RGB lineales a través de los datos RAW o mediante la inversión de la no linealidad descrita anteriormente, puede hacer un balance de blancos aplicando lo siguiente.

R_out = R_in * R_gain
G_out = G_in
B_out = B_in * B_gain

Tenga en cuenta que es convencional no aplicar una ganancia al canal verde, ya que se relaciona más o menos con la luminancia y cambiar los tres canales también cambiaría la exposición general.

Generalmente hay un campo de metadatos en los archivos RAW que contiene un conjunto de ganancias de balance de blancos calculadas por la cámara usando un algoritmo incorporado. Estos algoritmos generalmente se basan en alguna forma de algoritmo de estimación del iluminante de constancia de color.

Una vez que se aplican las ganancias, se debe aplicar una matriz primaria de codificación, la curva de reproducción del tono objetivo y el EOTF inverso.

agf1997
fuente
Tengo curiosidad por saber cómo se puede realizar el balance de blancos como se hace con Lightroom, donde tiene una temperatura de color y un tinte de color. Esos dos controles deslizantes se alinean perfectamente con los dos ejes de espacio de laboratorio planos, así como con la fórmula de ajuste de punto blanco basada en CIE que se puede encontrar en línea. ¿Es posible controlar la temperatura del color y el tinte por separado con este tipo de simplicidad? ¿Es ese otro cálculo para determinar R_gain y B_gain?
jrista
@jrista La temperatura de color y los valores de tinte se utilizan para definir una cromaticidad. Esa cromaticidad se convierte nuevamente en un conjunto de factores de ganancia R, G y B utilizados para el balance de blancos en el espacio de exposición de la escena.
agf1997
2

Tenía una excelente fotografía de una mujer que tomé bajo una iluminación extraña y compleja (luces de vapor de sodio y de mercurio). Gran sonrisa, enfoque perfecto, excelente imagen, excepto por el color.

Moné con temp / tint durante una hora en adobe Camera Raw sin ningún buen resultado. Escribí un programa para hackear el archivo XMP del sidecar variando la temperatura y luego creando un enlace simbólico al NEF original llamado paralelo al archivo XMP.

Esto NO es tan sofisticado ni técnicamente correcto como la respuesta anterior, sino que arroja una gran cantidad de CPU al problema y da algunos (posiblemente) resultados interesantes.

Esto crea un montón de enlaces de archivos .NEF y un archivo sidecar real .XMP para cada uno. Simplemente copie un combo de archivo nef / xmp real para clonar en el directorio de prueba y establezca la temp min / max y dif_temp (Kelvins entre clones). Se puede insertar otro bucle para variar el valor del tinte a un Kelvin constante, pero los archivos generados se multiplicarán por el número de tintes.

Ejecute el archivo de Photoshop -> scripts -> image_processor, apúntelo a este directorio y creará un tif / jpg / whatever real para cada enlace en la temperatura de color dada.

Este código es un truco sucio y feo y ejecutarlo probablemente derretirá su procesador mientras atrae rayos de bolas y abejas asesinas a las inmediaciones. Ninguna garantía es evidente.

Requiere Perl (seguramente usado diariamente) y mklink (puede estar presente).

sub color_temp_experiment()  {
$nef = '6s-2014.1004-237695.acl.nef'; 
$xmp = '6s-2014.1004-237695.acl.xmp';  # crs:Temperature="6000"
$min_temp = 7800;
$max_temp = 9000;
$dif_temp = 200;   # Difference in temp per loop.
$xd = `cat $xmp`;  # Xmp Data;
($base = $nef) =~ s/\.nef//;  # Basename common to both nef and xmp.
$ii = -1;
for($temp = $min_temp; $temp <= $max_temp; $temp += $dif_temp)  {
    $ii++;
    $link = $base . ".$temp" . 'k.nef';  # Abuse Kelvins with lower case.
    $xfn  = $base . ".$temp" . 'k.xmp';  # Abuse Kelvins with lower case.
    if(-f $link)  {
        print("Found FILE (s/b sym link!) $link. Next!\n");  # This prints!
        next;
    }
    $cmd = "mklink $link $nef";
    printf("$ii) Cmd = $cmd\n");
    $sto = `$cmd`;
    unless(-f $link)  {
        print("ERROR! Sym link $link not found!\n StdOut=<<$sto>>\n\n");
        exit;
    }
    ($xt = $xd) =~ s/crs:Temperature="\d+/crs:Temperature="$temp/ms;
    open(O, ">$xfn");
    print(O "$xt");
    close O;
}

}

BrianP007
fuente