En las entrañas del RAW Nikon (II). La compresión

Nuestra busqueda del algorismo exacto que Nikon emplea para comprimir sus RAW nos llevó hasta el código fuente del dcraw. Buceando en el código en busca del método de compresión de Nikon, encontramos las funciones:

void CLASS canon_compressed_load_raw()

void CLASS nikon_compressed_load_raw()

Aquí, en esta última, debe estar la respuesta.

El código es durillo y no se nos remite a ninguna documentación directamente útil. Yo solamente quiero saber como se pasa de 12 bits por pixel a 9'4 (en la D70). Hace unos años me hubieran entrado unas ganas incontrolables de descrifrarlo y no me hubiera acostado sin estar seguro de entenderlo. Pero ahora soy de otra manera (pronto cumpliré 39), y pienso que alguien lo habrá hecho antes por mi.

En efecto, un vistazo al google me lleva a Low Intensity Weblog de Fazal Majid, donde (como de costumbre) se pone a parir a Ken Rockwell y se da la respuesta: una curva que yo he redibujado asi:

Creo que esta versión es algo más elocuente. En las X (horizontal) figura el valor original leido por el sensor, número "largo" de 0 a 4095 y el las Y el valor comprimido "corto", de 0 a 682. Aquí está el truco, el extremo de la derecha se ha comprimido de modo que podemos expresar el mismo rango de valores pero con menos bits.

Hay que tener en cuenta que en realidad no nos interesa el valor leido si no más bien su logaritmo (duplicar la intensidad equivale a un punto de exposición). De modo que a compresión no es tan exagerada como aquí podría parecer. Para la D200, supongo que la curva debe ser similar a esta (pero no lo puedo asegurar).

Si los ordenadores pudieran trabajar con números reales con toda su infinita precisión (digamos en el mundo de Platón o de Kantor), esta compresión no representaría ninguna pérdidad de calidad. Pero al usar unos pocos bits, esto significa que hacia el extremo de las luces, dos valores que en el RAW parecen idénticos pueden ser en realidad sutilmente diferentes.

Si miramos los valores usados para dibujar la curva, vemos algo asi:

Comprimido - Sin comprimir

0, 0

1, 1

2, 2

...

215, 215

216, 217

217, 218

..

680, 4070

681, 4085

682, 4095

Es decir, para la D70 no hay pérdida de información hasta el número 215. El 216 comprimido representa al 217 y 218, ya al algo de"posterizacion". Y el 682 se usa indistintamente desde 4085 hasta 4096.

Para guardar los valores comprimidos (entre 0 y 682) se hace uso de otra técnica de compresión, ahora sin más pérdida de información, llamada Huffman Tree. Consiste en usar un número menor de bits para los valores que se utilizan más veces, por ejemplo, en un texto normal la letra 'a' es mucho más frecuente que la 'z', de modo que no hay necesidad de usar 8 bits para todas ellas como en el código ASCII. La frecuencia con que se usa cada letra, o cada valor, se analiza para cada texto, las más frecuentes se escriben con menos bits.

Esto explica por que los archivos NEF tienen longitudes ligeramente diferentes. Una foto hipotética en el que todos los pixels tuvieran exactamente el mismo valor ocuparía muy poco.

Y esto, ¿qué significa en la práctica? Pues que en las fotos correctamente expuestas, y en la mayoria de las ligeramente sobreexpuestas, la diferencia entre el RAW comprimido y sin comprimir, es casi inapreciable a todos los efectos. Esto es lo que dice la voz del hombre de la calle, Ken Rockwell, y también el manual de Nikon. Ahora, seguro que se puede encontrar un ejemplo en el que la diferencia entre ambos sea importante.

Para terminar, solamente recordar que lo escrito hasta aquí vale para cada uno de los canales RGB. Como los sensores de cada color no están en el mismo lugar físico, después de haber obtenido los datos de cada canal hay que proceder a interpolarlos para recuperar una imagen coherente.

Comentarios

Anónimo ha dicho que…
Muy interesante pero tú que vas a hacer ¿Continúas tirando en comprimido o no?
Yo de momento sí.

Albert
Jesús ha dicho que…
Albert, sólo de ver tan gráficamente lo que hay que hacer currar a la máquina casi estoy por darle un respiro.
En serio, yo el comprimido sólo cuando voy a saco (como en los observatorios)
Manel he perdido lo poco de "matemático" que quedaba en mi sesera (pero me ha traido buenos recuerdos ... 201 = RET ¿o era el 205?)
Me ha costado seguirlo, entiendo que a más alta luz ->más compresión-> menos información. ¿Y no es por recuperar esas luces por lo que se ha escrito tanto estos últimos meses?
Anónimo ha dicho que…
Jo, me dejais que NO SÉ QUE HACER!!!
Albert
frikosal ha dicho que…
Yo de momento sigo con el comprimido. Voy a ver si consigo encontrar un ejemplo en el que se vea claramente la diferencia. Si cambio de opinion ya os lo dire.

Entradas populares de este blog

¡ En busca de la luz zodiacal !

Andrómeda en el palacio de Siddharta