Manejar el rango dinámico de las imágenes nunca ha sido tan fácil. En este mensaje presento una nueva herramienta para componer imágenes HDR, partiendo de datos calibrados, que permite alcanzar el resultado mostrado abajo con sólo unos cuantos clicks de ratón:
La imagen de arriba ha sido compuesta por tomas que van desde 2,5 segundos hasta media hora de exposición, y fueron tomados con una Canon 300D y dos tubos ópticos diferentes (FC100 y 80ED) por José Luis Lamadrid y Vicent Peris.
La implementación de esta herramienta se ha llevado a cabo mediante un script de Java en PixInsight, escrito por Oriol Lehmkuhl, y que se entrega con la versión 1.3 de PixInsight. Este script se basa en el algoritmo publicado por mí en este mismo foro:
http://pixinsight.com/forum/viewtopic.php?t=421http://pixinsight.com/forum/viewtopic.php?t=426El Algoritmo de Composición HDREste algoritmo compone imágenes de alto rango dinámico lineales. Esto significa que, para todo el rango dinámico de los objetos se trata de conservar la linealidad de los datos. Por lo tanto, tener una imagen HDR lineal es equivalente a tener un sensor digital con fotositos que tuvieran un pozo que diera cabida a millones de electrones.
Para componer la imagen, cada una es multiplicada por un factor para ajustarse al flujo de las otras imágenes. El resultado final es una especie de pirámide fragmentada, donde las exposiciones más cortas se superponen sobre las áreas saturadas de las más largas:
Para hallar el factor entre las imágenes, el algoritmo compara la diferencia de iluminación de las mismas regiones de la imagen entre pares de imágenes. Para el ejemplo de arriba, la exposición de 30 minutos ha sido multiplicada por 0,004 para ajustarse al nivel de iluminación de la exposición de 2,5 segundos.
El Interface del ScriptEl interface del script se basa en conceptos sencillos. Hay tres secciones principales:
- El interface para la selección de las imágenes a combinar.
- Los parámetros para ajustar el algoritmo de composición HDR.
- Las opciones de postprocesado para comprimir el rango dinámico de la imagen resultante.
Primero debemos decirle al script qué imagenes queremos combinar. Esto se hace simplemente apretando el botón
Add y seleccionando los archivos correctos. El script determinará automáticamente qué imágenes tienen más o menos exposición.
Las imágenes a combinar deben estar debidamente calibradas y registradas, ya que este script no realiza el trabajo de calibrado ni el de registro, sino solo el de composición y compresión del rango dinámico.
Los parámetros del algoritmo se dividen en tres secciones. La primera concierne a los mapas de intensidad que se usan para comparar los niveles de iluminación entre las imágenes. Aquí debemos definiar los límites de selección para los pixel entre dos rangos de iluminación. A estos rangos los denominaremos como "highlights" and "lowlights", ya que un rango de iluminación debe ser más alto que el otro.
Normalmente se obtendrá un buen resultado con los parámetros por defecto, los cuales establecen los rangos de iluminación en [0,6 - 0,8] y [0,2 - 0,4], dentro del intervalo [0 - 1]. Hay que tener en cuenta que debemos averiguar con exactitud cuál es la diferencia de iluminación entre los dos rangos de iluminación, por lo que es conveniente establecer el límite superior de lowlights por debajo del límite inferior de highlights.
Como hemos dicho, el algoritmo superpone las exposición más cortas sobre las áreas saturadas de las más largas. Para establecer el límite de iluminación de la exposición larga donde vamos a superponer la corta, el script genera una máscara binaria. El límite de esta máscara binaria se establece en el parámetro
Binarizing threshold. En la mayoría de casos, el valor de 0,8 funcionará bien.
Como siempre, la precisión está limitada por el ruido, por lo que las dos imágenes nunca se ajustarán a la perfección; el parámetro
Mask smoothness suavizará la unión entre los pares de imágenes. El algoritmo suele dar resultados muy precisos, limitados por el ruido y la linealidad del sensor, por lo que un ligero suavizado quitando 2 ó 3 capas de wavelets a la máscara funcionará bien en la mayoría de los casos. Por último podemos ajustar un crecimiento de la máscara (
Mask growth) para cubrir correctamente los bloomings, en caso de que estemos trabajando con sensores CCD sin antiblooming.
Hay tres opciones de salida para las imágenes resultantes. Para imágenes donde se cubra un rango dinámico muy extenso (como el ejemplo de M42 presentado al inicio), es conveniente trabajar con 64 bits de precisión. También pueden obtenerse las máscaras calculadas, por si fuéramos a necesitarlas en el futuro. Por último, tenemos la opción de corregir la iluminación del fondo del cielo; esto funciona muy bien con imágenes astronómicas, pero normalmente no tiene sentido utilizarlo si vamos a componer imágenes HDR "terrestres".
La tercera sección efectúa la compresión del rango dinámico a través de dos pasos básicos:
- Una modificación del histograma para elevar la iluminación de la imagen.
- Aplica el algoritmo de HDR-Wavelets para comprimir el rango dinámico de la imagen.
Al tratarse de imágenes HDR lineales, normalmente se necesita un valor muy pequeño de transferencia de medios tonos. Para la imagen del inicio, el valor aplicado ha sido de 0,0002.
Para una aplicación rápida del algoritmo de HDR-Wavelets, hemos puesto en la inteface del script los dos principales parámetros que lo rigen: el número de capas de wavelets a aplanar y el número de iteraciones que realiza el algoritmo. Si activamos las opciones de postproceso, el script nos entregará dos imágenes: la composición HDR lineal original y la imagen procesada. Estas opciones de postproceso nos permitirán ver rápidamente si todo ha ido bien, pudiendo asímismo trabajar sobre la composición HDR original para obtener posteriormente el resultado deseado, trabajando sobre las herramientas independientes de PixInsight.
EjemplosA continuación presentamos tres ejemplos más de los resultados alcanzados con el script. El primero es la nebulosa Ojo de Gato, con datos adquiridos por Romano Corradi con el Telescopio Óptico Nórdico del Observatorio de Roque de los Muchachos.
Los datos pueden descargarse desde aquí:
http://www.ing.iac.es/~rcorradi/HALOES/El resultado es la combinación de varias exposiciones a través de filtros estrechos de O-III (turquesa), H-alfa (naranja) y N-II (rojo), con la cámara ALFOSC:
O-III: 6x5 min, 1x2 min and 1x30 seg.
H-alfa: 3x10 min, 1x100 seg.
N-II: 3x10min, 1x1 min.
Al aplicar dos iteraciones del algoritmo de HDR-Wavelets con tres capas pueden verse las estructuras de la nebulosa a través de todo su rango dinámico:
Para verla a resolución original:
http://forum-images.pixinsight.com/legacy/HDRscript/ngc6543not2.jpg(Nota: El halo grande y brillante fue causado por los filtros situados cerca del plano focal del telescopio)Abajo puede verse que el algoritmos recuperó las áreas cubiertas por los bloomings. Como las exposiciones cortas tienen una relación señal a ruido baja, puede apreciarse que estas áreas tienen una contribución mayor del ruido. Pero el escalado entre las exposiciones se ha hecho perfectamente porque no hay ningún peldaño de iluminación artificial:
El segundo ejemplo es la fotografía de la galaxia NGC 7331 que realicé con el telescopio Zeiss de 3,5 metros de Calar Alto. La imagen se adquirió con los filtros B y V de Johnson y el filtro r' de Sloan; para cada uno de los filtros se obtenieron exposiciones de 1 y 10 minutos.
Aquí pueden verse las imágenes originales con juste de medios tonos:
Y un recorte del núcleo de las imágenes lineales originales, donde pueden apreciarse los bloomings sobre el núcleo de la galaxia:
El resultado después de la composición HDR y el postprocesado con HDR-Wavelets y una subida moderada de los medios tonos es este:
El último ejemplo es una foto "terrestre" tomada por Rogelio Bernal con una cámara Canon 40D. Esta es la secuencia de imágenes originales en lineal:
Esta es la imagen compuesta con ajuste de medios tonos, donde las lámparas quedan sobreiluminadas:
Sin embargo, procesando la imagen con HDR-Wavelets y aumentando la saturación de color, podemos recuperar todo el rango tonal de la escena:
ConclusiónEste script ofrece una solución a uno de los problemás más difíciles en el procesado de imágenes astronómicas. Pero todavía más importante, esta solución se da a través de algoritmos sencillos, buscando siempre un respeto absoluto a los datos recogidos. La intervención humanda se reduce al mínimo y el proceso de composición da como resultado una imagen del objeto "tal como es". Ya no son necesarios más procedimientos de "expertos" (aunque dudosos): simplemente tenemos nuestros datos reales con unos pocos clicks de ratón. Ahora sólo tenemos que preocuparnos de extraer toda la belleza de nuestras imágenes.
AgradecimientosUn agradecimiento especial para Rogelio Bernal, por habernos cedido sus datos RAW, y para Juan Conejero por haber revisado el código fuente del script.
Vicent.