Reparación de alinealidades del sensor
Teóricamente, el sensor de nuestras cámaras digitales debe comportarse de forma lineal en relación a la cantidad de luz que recibe. Esto quiere decir que, dado que su labor es convertir una señal luminosa en una señal eléctrica, si aumentamos al doble la cantidad de luz que recibe, la señal eléctrica que produce también debería aumentar al doble (si bien luego se aplica una curva gamma a las imágenes para compensar el hecho de que nuestro ojo no es sensible de forma lineal a la intensidad luminosa, pero el sensor de la cámara sí lo es).
Obviamente este comportamiento lineal tiene un límite y tarde o temprano el sensor se saturará y a mayor cantidad de luz no será capaz de producir una señal eléctrica más elevada. Este es el punto de saturación de la cámara y es el responsable de que la cámara queme las zonas más expuestas en algunas escenas.
Hasta que se alcance ese punto de saturación esperamos que el sensor sí se comporte de una forma suficientemente lineal, sin embargo, como vamos a ver en este artículo, no siempre es así, especialmente en las cámaras con sensores pequeños (como las cuatro tercios de Olympus).
Guillermo Luijk escribió un estupendo artículo sobre la linealidad del sensor que os recomiendo leer (su artículo tiene mucho mas miga que el mío
), así que no voy a repetir lo que él ya ha hecho. Lo que voy a hacer es seguir su procedimiento (de hecho contando con su ayuda ) con mi Olympus E-510 que tiene un sensor más pequeño que su Canon EOS 350 y, por tanto es de esperar que los resultados puedan ser algo menos lineales. Además, yo he realizado los cálculos en 12 bits y sin sustraer el punto negro (es decir, datos raw completamente crudos) por lo que el análisis es más preciso.
Originalmente publiqué esta información en este hilo de OjoDigital.
Antes de nada, ¿qué le pasa a la imagen si el sensor no se comporta linealmente cerca de la saturación? Pues le pasa esto (hay algunos ejemplos mejores, pero este es el primero en el que me di cuenta de la causa):

¿Veis el halo magenta en la zona donde se empieza a saturar la imagen? También se aprecia, aunque con más dificultad, en el borde frontal de la encimera. Es la consecuencia de que no todos los canales se comportan igual conforme la luminosidad aumenta, cambiando el valor del blanco en la imagen (como la imagen tiene el balance de blancos bien equilibrado el blanco se ve neutro, pero de pronto, en la zona del halo magenta, deja de serlo).
La imagen está exageradamente expuesta y no parece una imagen utilizable. Sin embargo, disparé esa toma como parte de un horquillado con otras dos para montarlas con ZeroNoise y tuve problemas al montarlas debido al fenómeno que analizo en este artículo.
Algunos pensaréis que la causa es que el punto de saturación está mal y que hay que desechar los datos “desde más atrás”. Desde luego es una solución (revelando con dcraw que permite hacer esto, en la mayoría de reveladores comerciales no tienes control de ese parámetro), pero para lograr eso hay que bajar el punto de saturación demasiado porque el sensor de la Oly (que fabrica Matsushita/Panasonic) empieza a desviarse del comportamiento lineal demasiado pronto, como veremos a continuación.
Siguiendo el procedimiento descrito por Guillermo Luijk en su artículo, tomé una serie de tomas raw de una superficie blanca iluminada uniformemente (que se ve verde porque mi cámara tiene el balance de blancos fijo en UniWB):

Las tomas se realizan variando la compensación de exposición (los valores de esta compensación se corresponden con el eje horizontal de la gráfica de abajo, así, +2 en ese eje corresponde a +2 EV sobre el valor medido por la cámara).
A partir de ahí utilicé una versión de dcraw modificada que obtiene el valor medio de un parche en el centro de cada imagen y lo exporta a una hoja de Excel, con la que obtuve la siguiente gráfica:
Esta gráfica mide directamente (tras aplicar una gamma) el comportamiento del sensor (la salida, OUT) en función de la luz que incide sobre él (la entrada, IN).
Como se observa, la respuesta del sensor es aproximadamente lineal (con oscilaciones en la parte baja debidas al ruido), pero el canal azul se desvía del comportamiento lineal hacia el 3 horizontal. El canal rojo también se desvía a partir de ese mismo valor de entrada pero de forma mucho menos apreciable.
Esta es la razón por la que la relación entre los tres canales (el valor de blanco de la imagen), que había permanecido aproximadamente constante durante toda la curva deja de serlo. En la imagen de arriba tenemos un exceso de rojo y azul sobre el canal verde que hace que la imagen se vuelve magenta cerca de la saturación (el canal verde suele saturar antes que los otros dos canales y por esa razón las altas luces se vuelven magentas cuando el punto de saturación es incorrectamente alto).
Este fenómeno ocurre debido al llamado sensor blooming, que viene a querer decir que los captores que se han saturado se desbordan sobre los adyacentes, haciendo subir el valor que estos miden. Este fenómeno es más acusado en sensores pequeños y de alta resolución dada la mayor proximidad de los captores. Por otro lado, los sensores CMOS presentan mucho menos blooming que los CCD, aunque la Oly E-510 usa un sensor CMOS (en realidad un LiveMOS).
No debe confundirse este fenómeno con la saturación parcial que también comenta Guillermo en su artículo.
Si queremos reparar esto mediante la bajada del punto de saturación (este ajuste equivale a cortar el eje OUT a partir de un punto) habría que bajarlo desde -0,5 hasta -2,5 desperdiciando una cantidad apreciable de información.
Una posible solución pasa por modificar dcraw para que baje artificialmente los canales azul y rojo una vez que el canal verde ya se ha saturado. Si se hace con cuidado se puede conseguir una reparación perfecta.
La experiencia me dice que la reparación requiere cierto ajuste para cada imagen aunque es bastante estable en escenas normales, pero que con un par de parámetros (desde dónde se corrije y con qué pendiente) es posible reparar cualquier imagen en la que este fenómeno sea molesto (que sin embargo es bastante incómodo de reparar a base de postprocesado).
El ejemplo de arriba, una vez reparado con este método (en plan rápido, puede mejorarse el resultado dedicándole un poco más de tiempo):

Una versión más avanzada del código analiza la imagen para rescatar la máxima información posible en la zona de altas luces en combinación con el parámetro de revelado -H 2:
// To the extent possible under law, Manuel Llorens <manuelllorens@gmail.com>
// has waived all copyright and related or neighboring rights to this work.
// This code is licensed under CC0 v1.0, see license information at
// http://creativecommons.org/publicdomain/zero/1.0/
// Correct Olympus sensor alinearities
M=0;
for(x=0;x<width-1;x+=2)
for(y=0;y<height-1;y+=2){
R=R2=image[y*width+x][0];
G2a=image[y*width+x+1][1];
G2b=image[y*width+x+width][3];
G=(G2a+G2b)/2;
B=B2=image[y*width+x+width+1][2];
// Reduce red channel
if((R>1100)&&(G>2.0*(float)maximum/4.0)){
if(R>1400)
R2=(int)CLIP(1340.0+(R-1328.6)/1.30);
else
R2=(int)CLIP(1100.0+(R-1100.0)/1.05);
}
// Reduce blue channel
if((B>1600)&&(G>2.25*(float)maximum/4.0)){
B2=(int)CLIP(1600+(B-1600)/1.35);
}
// Reduce and raise green channel
if(G>2950){
if(G<3300){
G2a=(int)CLIP(2950+(G2a-2950)/1.02);
G2b=(int)CLIP(2950+(G2b-2950)/1.02);
}else{
G2a=(int)CLIP(3296.5+(G2a-3300)/0.75);
G2b=(int)CLIP(3296.5+(G2b-3300)/0.75);
}
}
image[y*width+x][0]=R2;
image[y*width+x+1][1]=G2a;
image[y*width+x+width][3]=G2b;
image[y*width+x+width+1][2]=B2;
// Optional: Calculate new conservative saturation level
if(G2a>M) M=G2a;
}
maximum=M/1.14;
Tras un buen rato jugando con las curvas en Photoshop (PS) (aquí tenemos mucho control pero es bastante complicado acertar. Es necesario modificar el extremo derecho de la curva de cada canal por separado) he obtenido un buen resultado porque me he dado habilidad a recuperar el amarillo de los azulejos, pero probablemente no quedaría bien montada con ZeroNoise porque modifica demasiado arbitrariamente la imagen.
Obviamente con GIMP puede obtenerse un resultado similar (de hecho la ventana del editor de curvas de GIMP es reescalable y permite un control más exacto).
Comparación de los resultados por los tres métodos (usando el código de arriba y con ajuste de curvas en PS y en GIMP):

| Original | Dcraw parcheado | Curvas en Photoshop | Curvas en GIMP |
Como ejemplo, la curva que he aplicado en GIMP para el canal rojo:

Buceando en la documentación del SDK de DNG de Adobe para documentar el artículo de equilibrado de canales verdes he descubierto otro método para corregir este defecto utilizando el DNG Converter, el fantástico ExifTool y un revelador basado en ACR (Photoshop o Lightroom). Luego he visto en un foro que ya hay algunos usuarios utilizando este último método para resolver un problema parecido (usar ACR para revelar fotos de cámaras que aún no tienen el punto de saturación bien ajustado en estos reveladores).
La idea es que el formato DNG guarda en una etiqueta a partir de qué punto la imagen deja de ser lineal. El tag es Linear Response Limit. Si convertimos la imagen a DNG utilizando el DNG Converter, luego modificamos el valor de esa etiqueta con ExifTool y finalmente la revelamos con PS o LR, el problema también se arregla. Creo que lo que hace ACR en esos casos es utilizar el balance de blancos para neutralizar la información a partir del punto especificado, porque si se baja mucho lleva la imagen a gris a partir de ese punto… más o menos. El resultado:

| Linear Response Limit = 1.0 | Linear Response Limit = 0.95 | Linear Response Limit = 0.85 |
No es tan efectivo como los métodos anteriores, eso está claro.
Mi idea es tratar de integrar la reparación automática de alinealidades cuando sea capaz de diseñar un algoritmo para la recuperación de altas luces.

[...] Reparación de alinealidades del sensor. Rawness. [...]
ComentarioPingback by Nivel de saturación RAW de la Nikon D3000 « Notas y apuntes sobre fotografía — 14 agosto, 2011 - 18:10
Muchas gracias de nuevo, Ariel. ¿Qué más cosas puedo intentar arreglar?
Comentario by Manuel Llorens García — 24 marzo, 2010 - 09:33
Muchas gracias Manuel, veo que tambien solucionas otro de mis dolores de cabeza, (el contraste local), es de gran ayuda para mí y creo que para muchos también que compartas tu tabajo en la web, así que mi agradecimiento.
Saludos.
Comentario by Ariel — 23 marzo, 2010 - 16:11
Ariel, he ampliado el artículo con el código necesario y otro método para lograr el mismo resultado. Gracias.
Comentario by Manuel Llorens García — 12 marzo, 2010 - 14:58
Ramón, gracias a ti por leerme.
Desde mi punto de vista, y dependiendo del tipo de fotos que uno haga, ZeroNoise ofece un salto cualitativo en cuanto a calidad de la imagen final, pues permite obtener HDR sin halos ni efectos extraños y, al mismo tiempo, ampliaciones enormes sin ruido en las sombras. Anímate a probarlo porque es sencillo de usar y creo que los resultados son sorprendentes. Más adelante escribiré aquí un artículo al respecto.
Es cierto que mientras haces estas cosas no haces fotos. Y que algunos fotógrafos piensan que la fotografía no tiene nada que ver con estos aspectos técnicos. Obviamente, los que nos dedicamos a esto por hobby tomamos lo que nos gusta y si alguien más puede encontrarle una aplicación práctica en su trabajo, pues bienvenido sea, ¿no?
Comentario by Manuel Llorens García — 12 marzo, 2010 - 14:57
Siempre me ha sido un dolor de cabeza eliminar ese color mangenta, comentas de modificar el DCRAW para que baje los canales no saturados, como se haría esto?
Comentario by Ariel — 12 marzo, 2010 - 14:04
Hubo un tiempo en el que estuve toqueteando dcraw, a través de perfectraw, pero la verdad es que zeronoise aunque he leído algo de lo que ha escrito Guillermo no lo he probado. Lo malo de estas cosas es que necesitan cierto tiempo para ser digeridas y entre tanto no haces fotos
Pero sigo al quite de todo lo que va surgiendo para estar al día. Gracias por tu trabajo.
Comentario by Ramón Portillo — 12 marzo, 2010 - 12:35
Muchas gracias, Ramón. Me alegro de que te resulte interesante. Si te ha gustado este artículo te encantará el de equilibrado de canales verdes cuando lo escriba.
Personalmente, considero fascinantes estos aspectos técnicos y, si bien creo que no constituyen la clave para hacer mejores fotos, sí pienso que pueden ayudarnos a entender mejor cómo funcionan nuestras cámaras y por tanto liberarnos de sus limitaciones. Por ejemplo, ¿has visto los resultados de usar el ZeroNoise de Guillermo? Está claro que el dominio de la técnica ayuda al fotógrafo a expresarse creativamente con más libertad.
En cualquier caso, de éste artículo casi todo el mérito es de Guillermo.
Un saludo.
Comentario by Manuel Llorens García — 10 marzo, 2010 - 22:56
Jó macho! Yo también tengo la E-510 y me has dejado alucinado con el nivel de conocimiento de bajo nivel que demuestras de estos procesos…
Saludos.
Comentario by Ramón Portillo — 10 marzo, 2010 - 19:55