Friday, August 31, 2012

El problema "magenta"

Después de comprarme una EOS 550D comencé a notar que, cuando editaba fotos con zonas "quemadas", estas zonas presentaban un color magenta. Este color magenta desaparecía cuando sobreexponía la foto (por software).

El problema es el siguiente, dcraw tiene una lista de cámaras soportadas. Dentro de las muchas cosas que se definen para cada cámara soportada, está el nivel de saturación de cada uno de los sensores.

Aparentemente, había un error en el nivel de saturación correspondiente al sensor de la 550D.

Afortunadamente, el programa dcraw sugiere una manera de conocer el nivel de saturación en una foto determinada.

Buscando por internet conseguí que, aplicándo ese procedimiento a fotos tomadas con ISO 100, podías conseguir el valor "absoluto" de nivel de saturación del sensor que hizo dicha fotografía.

El nivel de saturación es la máxima cantidad de luz que puede recibir el sensor de la cámara. Más allá de este nivel, el sensor es incapaz de percibir diferencias en la luz.

Como uso ufraw para procesar mis raw y este programa utiliza dcraw, el problema me aparecía cada vez que procesaba una foto con zonas quemadas.

Con esto en mente, voy a explicar como hice para conocer el valor del nivel de saturación del sensor de la EOS 550D y que me ha funcionado hasta ahora.

Nota: Este procedimiento está realizado y probado en linux utilizando dcraw, ufraw y netpbm.


Requisitos

Para realizar este procedimiento se necesita:
  • Linux
  • ufraw (fuentes)
  • dcraw (fuentes)
  • pamsumm (viene en el paquete netpbm. En Debian esto no es así por lo que habría que bajarse las fuentes y compilarlo)
  • Una colección de archivos raw tomados con ISO 100

Procedimiento

  1. Descargarse la versión más reciente de dcraw (fuentes) y compilarla

  2. Asegurarse de tener instalado el binario pamsumm que es parte del paquete netpbm. En Debian no lo es, así que hay que bajarse las fuentes y compilarlas.

  3. Con el dcraw compilado y un archivo raw a ISO 100,  correr el siguiente comando:

    ./dcraw -D -4 -j -c archivo.raw | pamsumm -max


  4. Este comando debería mostrar un mensaje como el siguiente:

    "the maximum of all samples is 13584"

    Este es el valor del nivel de saturación. Su equivalente hexadecimal es lo que tenemos que colocar en el archivo dcraw.cc en las fuentes de urfaw.


  5. En el archivo dcraw.cc de las fuentes de ufraw, reemplazar la línea
    { "Canon EOS 550D", 0, 0x3dd7, { 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 } },

    por la línea

    { "Canon EOS 550D", 0, 0x3510, { 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 } },

    El valor 0x3510 es el equivalente hexadecimal de 13584.



  6. Compilar ufraw y hacer las pruebas