Por Carlos Sonnenstein (PTeam)
Datos originales adquiridos por Ignacio Rico
Con este documento presentamos un ejemplo de procesamiento detallado, y paso a paso, de una imagen DSLR de cielo profundo. Hemos querido recopilar esta vez algunas técnicas de procesamiento que incluyen tratamientos relativamente sencillos como la conversión de formato de archivo, transformaciones geométricas, modelización del fondo del cielo, y otros algoritmos más avanzados y sofisticados como tratamiento de alto rango dinámico por wavelets y reducción de ruido, entre otros.
En esta ocasión hemos escogido una excelente imagen DSLR de M45 adquirida por Ignacio Rico, quien muy amablemente nos la ha cedido para la ocasión. La imagen es el resultado del promedio y calibrado con darks de 21 tomas de 20 minutos (ISO 400) a través de un telescopio Takahashi Sky 90 + reductor/aplanador a F/4.5 y cámara Canon EOS 400D sin modificar.
La Figura 1 muestra el resultado obtenido con PixInsight 1.2 mediante las técnicas y herramientas que vamos a describir en este ejemplo.
Figura 1— Imagen final obtenida tras el procesamiento con PixInsight 1.2, utilizando las técnicas y herramientas descritas en este tutorial.
(haga clic en la imagen para ampliar)
Algunos de los procesos y algoritmos que vamos a utilizar, como el manejo de alto rango dinámico por wavelets (High Dynamic Range Wavelet Transform) y transformaciones no lineales agresivas (HistogramTransformation) implican procedimientos numéricos complejos que requieren grandes espacios numéricos para evitar la degradación de los datos debido a errores por redondeo y truncamiento. Las imágenes raw de M45 han sido almacenadas originalmente en un formato entero de 16 bits. Antes de continuar, convertiremos la imagen al formato entero de 32 bits, que proporciona un rango numérico de 232 valores discretos en PixInsight.
La modelización del fondo es una técnica de procesamiento que permite corregir variaciones espúreas de brillo y color, como viñeteo residual y gradientes debidos a la polución lumínica. DynamicBackgroundExtraction (en adelante DBE) es una herramienta para llevar a cabo estas operaciones utilizando un alto grado de interacción con el usuario.
DBE funciona utilizando un juego de muestras definidas por el usuario en lugares específicos de la imagen. Cada muestra extrae un valor de píxel para cada canal de color. A partir de una apropiada distribución de un número determinado de muestras, el algoritmo de modelización reconstruye el fondo de la imagen utilizando un procedimiento de interpolación bidimensional basado en splines.
La ventana de la interfaz de DBE contiene un importante juego de parámetros que afectan al rendimiento del proceso de modelización del fondo del cielo. Dos de estos parámetros controlan el tamaño de las muestras (Default sample radius) y el número de muestras (Samples per row) utilizadas en el proceso de modelización. Un tamaño de muestra demasiado grande implica una pobre localización de muestreo, mientras que un tamaño demasiado pequeño conduce a una alta dependencia del ruido en el modelo del fondo generado.
Otro parámetro importante es la tolerancia (Tolerance) del algoritmo a la hora de rechazar píxeles que se desvían del valor medio estimado del fondo, que se puede identificar en la mayor parte de los casos con el pico principal en la distribución de las muestras.
Minimum sample weight, por otro lado, controla el peso estadístico mínimo que tiene que tener una muestra generada para ser incluida en el mecanismo de modelización.
Por último, el parámetro llamado Shadows Relaxation controla el factor de relajación que permite incluir más píxeles oscuros en el cálculo del modelo del fondo.
Antes de iniciar la sesión de DBE vamos a recortar los bordes de la imagen para evitar que el algoritmo incluya muestras donde no existe información. Este procedimiento lo llevamos a cabo aquí dinámicamente sobre la imagen RGB con la interfaz DynamicCrop, definiendo en primer lugar una función de transferencia de pantalla (ScreenTransferFunction), de forma que podemos visualizar fácilmente toda la información sin modificar los datos de la imagen.
A continuación desactivamos la función de transferencia de pantalla (STF) y aplicamos una función de transferencia de medios tonos y recorte de las sombras. Esta acción permite visualizar de forma mucho más precisa las variaciones de brillo en el fondo del cielo, para definir fielmente el conjunto de muestras de DBE que aplicaremos luego sobre los datos raw lineales.
Figura 4— Ajustando el balance de medios tonos y el recorte en las sombras con HistogramTransformation. (haga clic en la imagen para ampliar)
Después de la transformación, podemos visualizar claramente el viñeteo que afecta a la imagen, así como las nebulosidades más débiles del cúmulo M45.
Ahora podemos ajustar los parámetros de DBE para generar de forma automática un conjunto de muestras que serán colocadas sobre toda la imagen, asegurándonos de que las muestras sobre los píxeles más oscuros de las esquinas (causados por el viñeteo); en este caso esto lo podemos conseguir bajando el valor del parámetro Minimum sample weight. Se debe evitar colocar muestras sobre estrellas, aunque los algoritmos de rechazo pueden evitar éstas y otros objetos pequeños y brillantes muy eficientemente.
Figura 5— Distribución de muestras y parámetros utilizados con DynamicBackgroundExtraction. (haga clic en la imagen para ampliar)
Para conservar la posición de las muestras, así como el resto de parámetros de modelización del fondo del cielo, podemos crear un icono de proceso para almacenar toda la información previamente definida con DBE. Esto se puede conseguir haciendo click sobre el pequeño icono triangular azul en la esquina inferior izquierda de la ventana de DBE, y arrastrándolo a cualquier lugar desocupado del espacio de trabajo de PixInsight.
Ahora volvemos al estado anterior que contiene los datos raw lineales mediante el comando Undo (Ctrl+Z), y a continuación arrastramos sobre la vista nuestro icono de proceso.
Figura 7— Distribución de muestras con los mismos parámetros de DBE, pero esta vez aplicados a los datos raw lineales. Fíjese en el icono de proceso que nos ha permitido recuperar el estado de DBE que habíamos definido en la Figura 5. (haga clic en la imagen para ampliar)
Una vez que DBE ha generado el correspondiente modelo de fondo, o pseudo-flat, sólo necesitamos sustraerlo de la imagen raw. La idea es reproducir lo más fielmente el perfil de iluminación existente, para así poder compensar eficazmente las desviaciones de iluminación y color mediante una resta del modelo de fondo generado. Simplemente definimos la expresión desde PixelMath para sustraer de la imagen principal (M45suma) el pseudo-flat generado en DBE (M45suma_background). Para evitar que parte de la información escape del rango numérico disponible tras la operación entre imágenes, activaremos la opción Rescale result, con lo que no se producirá pérdida alguna de datos por truncamiento.
Figura 7— Expresión de PixelMath para restar el modelo del fondo. (haga clic en la imagen para ampliar)
Según la estrategia de procesado diseñada para este ejemplo, creemos que ya no existe motivo alguno para que los datos sigan siendo lineales, así que decidimos realizar una transformación no lineal de los datos basada en una función de transferencia de medios tonos y de recorte de las sombras. De esta forma la información registrada en todo el conjunto de exposiciones va a ser fácilmente visible.
SCNR (Subtractive Chromatic Noise Reduction) es una técnica diseñada específicamente para la reducción de ruido en el color de imágenes de cielo profundo. El proceso SCNR pertenece al conjunto estándar de herramientas de reducción de ruido disponible en PixInsight.
La estrategia en que se basa SCNR es bien simple: sabemos con certeza que a excepción de los cometas y ciertas regiones de algunas nebulosas planetarias, no existen en el firmamento estrellas ni objetos de cielo profundo que sean de color verde. La imagen de M45 de este ejemplo incluye principalmente nebulosidades de reflexión, que son de un color azul intenso. En este caso las nebulosidades se muestran de color cián (una mezcla de verde y azul) debido a un gran número de píxeles aislados de color verde. Asumiendo que el balance cromático de la imagen es globalmente correcto, podemos concluir que los píxeles verdes que forman parte de la tonalidad cyan del objeto son ruido, y por tanto pueden ser eliminados con seguridad.
Para reducir el impacto visual que producen las estrellas y otorgar un mayor protagonismo al objeto fotografiado, una técnica de procesamiento de imágenes bastante común es aplicar sobre la imagen un filtro de erosión (también llamado filtro de mínimo). El filtro de erosión forma parte del conjunto de transformaciones morfológicas disponibles en PixInsight (proceso MorfologicalTransformation), y tiene la característica de poder disminuir eficazmente los tamaños estelares cuando el filtro es aplicado mediante elementos estructurales apropiados. Sin embargo, al aplicar este tipo de filtro corremos el riesgo de que el resultado afecte también a los objetos nebulares y al fondo del cielo, generando artefactos no deseados. Eso significa que si queremos evitar este tipo de efectos necesitamos primeramente aislar las estrellas. Para aislarlas y procesarlas por separado existen varios métodos. Uno de ellos consiste en construir y emplear una máscara de estrellas.
Para generar una máscara de estrellas, en primer lugar calculamos la luminancia a partir de los datos en color dentro del espacio sRGB, y extraemos dicha componente como una nueva imagen (proceso ChannelExtraction). A continuación aislamos en la luminancia las estrellas mediante transformaciones basadas en wavelets.
ATrousWaveletTransform permite en PixInsight, entre otras funciones, efectuar un análisis multiescala basándose en la descomposicion de la imagen en varias capas (en este caso la luminancia), donde cada una de ellas contiene la información dentro de un rango de escalas dimensionales concretas. Así, la capas inferiores incluyen las estructuras de la imagen más pequeñas, tal como se definen según la función de escalado empleada, mientras que las capas superiores están formadas por estructuras de mayor tamaño. De esta forma podemos aislar convenientemente las distintas estructuras que forman la imagen, en función de sus tamaños característicos.
Efectuando una inspección de las diversas estructuras incluidas en la descomposición de la imagen por capas, llegamos a la conclusión de que en esta imagen las estrellas más pequeñas están presentes principalmente en una escala de dos píxeles, mientras que las más grandes y brillantes del cúmulo de M45 llegan a ocupar escalas de hasta 128 píxeles (capa número 8 en una secuencia diádica de descomposición). Lamentablemente no siempre es posible aislar por completo los objetos, ya que las nebulosas y algunas estrellas brillantes comparten algunas capas. Por fortuna existen otros mecanismos que ayudan a conseguir aislar correctamente las estrellas de una imagen.
Así pues decidimos deshabilitar la primera capa de wavelets, porque no incluye información estelar significativa; prácticamente sólo contiene ruido. Por otro lado, a partir de la capa número ocho las estrellas apenas contribuyen a la máscara, sino sólo con estructuras de mayor escala, como las nebulosidades que envuelven las estrellas más brillantes del cúmulo. Por lo tanto deshabilitamos también todas las capas superiores a 128 píxeles (recogidas dentro de la capa residual en la Figura 10).
Al aplicar esta transformación por wavelets generalmente la máscara pierde algo de contraste, así que decidimos incrementar el peso de todas las capas de wavelets supervivientes. Por último, para que la generación de la máscara mediante wavelets no dependa también del ruido de la imagen, modificamos además los parámetros de umbralización de ruido k-sigma, ajustando a su intensidad máxima (Amount) y removiendo con el umbral (Threshold) el ruido de pueda quedar en la máscara.
Lógicamente, tras esta transformación aún sobreviven en la máscara algunas estructuras que no son estrellas. Para perfeccionar nuestra máscara optamos por un camino sencillo pero efectivo: la binarización. Sabemos que las estructuras de gran escala que han sobrevivido están formadas por píxeles grises en su mayoría, por lo que es fácil eliminar estas estructuras aprovechando esta característica. El proceso Binarize en PixInsight (Process > IntensityTransformations > Binarize) transforma la imagen en dos únicos valores de píxel, negro (valor 0) o blanco (valor 1). El mecanismo de umbralización de Binarize permite también ajustar finamente la eliminación de dichas estructuras, aislando perfectamente las estrellas de la máscara.
Como los bordes de los objetos de la máscara han quedado demasiado recortados, tras el proceso de binarización, optamos por convolucionar ligeramente la máscara. Existen varias formas de desenfocar una imagen en PixInsight, entre ellas ATrousWaveletTransform.
En esta ocasión hemos querido tomar un camino distinto, pero no menos efectivo. Hemos pensado en aplicar a la máscara el filtro paso-bajo implementado en el proceso de reducción de ruido ACDNR. Para que la convolución sea efectiva, únicamente desactivamos el mecanismo de protección de bordes de ACDNR (edge protection) y ajustamos los parámetros del filtro de suavizado. Más adelante hablaremos del funcionamiento de este filtro dentro del procedimiento de reducción de ruido.
Finalmente, activamos la máscara sobre la imagen RGB y aplicamos el filtro de erosión (MorphologicalTransformation). Este filtro dispone en PixInsight de diversas posibilidades de configuración y ajuste. Nosotros hemos utilizado en este caso un elemento estructural circular de 5x5 píxeles, aplicando el filtro en varias iteraciones con intensidad moderada, de manera que el proceso sobre las estrellas es mucho más controlable.
Figura 13— Erosion filter applied to the stars through a star mask. (haga clic en la imagen para ampliar)
Creemos que el objetivo principal de reducir el impacto visual generado por la gran cantidad de estrellas de campo ha sido logrado aquí con éxito, pero a costa de disminuir considerablemente el contraste en las estrellas más débiles. Para minimizar este problema aumentamos de nuevo el contraste de las estrellas a través de la máscara, mediante una transformación por wavelets, añadiendo mayor peso en la capa de dos píxeles. La función de escalado escogida debe ser capaz de separar por capas eficazmente los componentes de muy pequeña escala, evitando también que las estrellas vuelvan a crecer en tamaño.
Figura 14— Aumentando el contraste de las estrellas débiles con ATrousWaveletTransform. (haga clic en la imagen para ampliar)
Aunque otras técnicas, como DDP (Digital Development Processing), pueden ser útiles en algunas situaciones, nosotros preferimos herramientas e implementaciones mucho más sofisticadas, como HDRWaveletTransform en PixInsight. Este proceso está diseñado específicamente para controlar el rango dinámico de las imáganes.
HDRWaveletTransform es un proceso que funciona realmente bien en muchos casos con sus parámetros por defecto. Sin embargo nosotros hemos modificado esta vez la función de escalado y el número de capas de wavelets que intervienen en el proceso, obteniendo resultados realmente espectaculares. Las estructuras del interior y exterior de las nebulosidades del cúmulo M45 aparecen ahora mucho mejor contrastadas.
Figura 15— Resultado tras aplicar el algoritmo HDRWaveletTransform en PixInsight. (haga clic en la imagen para ampliar)
El incremento de saturación de color puede llevarse a cabo de diversas maneras en PixInsight, bien mediante transformaciones de medios tonos, o aplicando ajustes de curvas en espacios de color concretos. Nosotros aconsejamos modificar la saturación de color trabajando dentro de los espacios de color HSVL ó CIE L*c*h*, ya que éstos consiguen separar mucho mejor las componentes cromáticas de la imagen.
En este ejemplo incrementamos la saturación de color actuando sobre la componente c* dentro del espacio CIE L*c*h*. En este espacio de color el aumento de saturación de color se puede realizar de forma mucho más agresiva, sin que por ello se produzcan desviaciones de tonalidad de color. Sin embargo, un aumento considerable de saturación de color, independientemente del espacio con el que se trabaje, acaba provocando un aumento visible del ruido en la crominancia.
Hemos escogido para esta imagen el proceso LRGBCombination en PixInsight, porque además de ser una excelente herramienta de combinación de imágenes LRGB, permite también por un lado aumentar la saturación de color mediante una función de ajuste de medios tonos aplicada sobre la componente c*, mientras se puede reducir al mismo tiempo el ruido en la crominancia (en el espacio CIE L*a*b*).
Como también nos interesa que los valores de píxel que corresponden al fondo del cielo continúen siendo lo más neutros posible, decidimos antes construir una máscara a partir de la luminancia, donde los píxeles del fondo del cielo sean completamente negros, mientras el resto de píxeles de los objetos y estrellas los dejaremos prácticamente blancos.
Extraemos de nuevo la luminancia a partir de los datos RGB y realizamos una transformación modicando las sombras y los medios tonos desde HistogramTransformation.
Figura 16— Construyendo una máscara de luminancia con HistogramTransformation. (haga clic en la imagen para ampliar)
A continuación desenfocamos ligeramente la máscara con ATrousWaveletTransformation, deshabilitando todas las capas de wavelets de hasta seis píxeles (usando una secuencia de escalado lineal), como puede verse en Figura 17.
Figura 17— Desenfocando la máscara de luminancia con ATrousWaveletTransform. (haga clic en la imagen para ampliar)
Antes de aplicar la saturación de color es muy útil inspeccionar detenidamente la protección del fondo del cielo, activando la máscara sobre la imagen RGB. Esto se puede hacer mediante el comando Mask > Show Mask.
Figura 18— Verificando la protección de la máscara con el comando Mask > Show Mask. Con la máscara visible, los píxeles que están siendo protegidos son oscurecidos en la representación de la imagen en pantalla. (haga clic en la imagen para ampliar)
Finalmente aplicamos el aumento de saturación de color desde LRGBCombination. Desactivamos los canales R, G y B (los cuales no intervienen aquí) y seleccionamos en la casilla L la luminancia de nuestra imagen RGB (identificada como Luminance_RGB). Por último definimos la función de ajuste de medios tonos sobre el canal de saturación, y ajustamos los parámetros de reducción de ruido para la crominancia.
Figura 19— Saturación de color y reducción de ruido en la crominancia con LRGBCombination. (haga clic en la imagen para ampliar)
ACDNR realiza las separaciones entre luminancia y crominancia, como lo hacen todos los procesos estándar en PixInsight, mediante espacios de trabajo RGB definidos colorimétricamente. Estos espacios de color se caracterizan, entre otros parámetros, por sus coeficientes de luminancia.
Los coeficientes de luminancia definen los pesos relativos de las componentes RGB individuales para el cálculo de los valores de luminancia para cada píxel. En el ejemplo mostrado en esta figura, se está definiendo un espacio de trabajo RGB uniforme, al asignar a todos los coeficientes de luminancia el mismo valor. Un espacio de color uniforme proporciona mejores separaciones entre luminancia y crominancia para imágenes de cielo profundo, en comparación con el espacio sRGB por defecto. Para saber más sobre este importante tema, puede leer un documento específico, perteneciente a la documentación oficial de PixInsight LE (en Inglés).
ACDNR (Adaptive Contrast-Driven Noise Reduction), como su nombre sugiere, reduce el ruido en la imagen adaptándose a la misma modificando su comportamiento en función de las variaciones de contraste detectadas.
Este algoritmo dispone principalmente de dos dispositivos: un filtro paso-bajo y un mecanismo de protección de bordes que incluye diversos métodos para lograr robustez en el proceso. Estos métodos permiten a ACDNR distinguir entre el ruido y las estructuras significativas de forma eficiente.
Adicionalmente, ACDNR incluye una función que permite filtrar el trabajo de reducción de ruido en función de los valores de una máscara generada por el propio proceso. En realidad el funcionamiento es el mismo que el de cualquier otra máscara de luminancia invertida en PixInsight, sólo que ACDNR mejora así con esta función la flexibilidad en la tarea de reducción de ruido. Esta característica es muy útil cuando deseamos proteger zonas con alta relación señal/ruido, mientras se aplica una fuerte reducción de ruido en áreas con menos cantidad de señal, como son las regiones del fondo del cielo.
Anteriormente redujimos el ruido en la crominancia, al mismo tiempo que incrementábamos la saturación de color. Sin embargo el ruido aún está presente en la luminancia. En imágenes en color como la de nuestro ejemplo, ACDNR ofrece dos conjuntos independientes de parámetros: uno para la luminancia y otro para la crominancia.
Desactivamos a continuación en ACDNR todos los parámetros para la crominancia y ajustamos únicamente los correspondientes a la componente de luminancia. Esto se consigue desactivando la casilla Apply en la sección dedicada a la crominancia. Antes de ajustar el parámetro StdDev del filtro, creemos que es una buena idea analizar el tipo, naturaleza y distribución del ruido. Esto se puede hacer cómodamente visualizando la luminancia. Seleccionado la opción Luminance L* en la barra horizontal de herramientas, o mediante el comando Image > Display > Luminance (Ctrl+Shift+L), la luminancia de la imagen se representa en pantalla como una imagen en escala de grises. Para volver al modo de representación RGB normal, seleccione Image > Display > RGB/K (o pulse Ctrl+Shift+0).
Como el ruido existente está distribuido sobre la imagen en escalas de tamaño relativamente pequeñas, ajustamos un valor moderado de StdDev y una intensidad de filtrado moderada, al igual que el número de iteraciones. En la sección de protección de bordes de ACDNR (Edge Protection) decidimos dejar los parámetros por defecto, excepto para los umbrales (Threshold), los cuales los ajustamos finamente hasta obtener los mejores resultados posibles con nuestra imagen.
Por último, ajustamos también la máscara de luminancia invertida de ACDNR mediante la función de previsualización en tiempo real, filtrando el proceso de reducción de ruido y prestando atención a la protección conseguida sobre las zonas con relación señal/ruido más elevada (píxeles oscuros en la máscara).
Figura 20— Ajustando la máscara de luminancia de ACDNR en modo de previsualización en tiempo real. (haga clic en la imagen para ampliar)
Cada vez que se aplica un filtro de suavizado o una convolución con un filtro paso-bajo, la función del filtro tiende a reagrupar los valores de píxel a lo largo del rango dinámico. Y por supuesto ACDNR no es una excepción, ya que utiliza para efectuar la reducción de ruido un filtro paso-bajo. En ocasiones, si la función que se aplica es muy suave, aparecen en el histograma espacios vacíos en los extremos del rango dinámico. Esto suele ser particularmente visible en la zona de las sombras, que es donde la reducción de ruido suele actuar en mayor medida. Este efecto implica lógicamente una ligera pérdida de contraste, por lo que necesitamos redistribuir de nuevo los valores a lo largo del rango numérico disponible. Las funciones AutoZero Hightlights y AutoZero Shadows, incluidas en la interfaz de HistogramTransformation, efectúan el reajuste necesario de forma automática.
Como ajuste final del procesado de la imagen también incrementamos al mismo tiempo ligeramente los medios tonos en HistogramTransformation, haciendo así más visibles las nebulosidades más débiles del cúmulo. La imagen aún puede beneficiarse en algunos otros aspectos, como un aumento de contraste en las estructuras brillantes y oscuras de gran escala. Sin embargo esto escapa al propósito de este documento.
Figura 21— Ajustes finales de contraste con HistogramTransformation. (haga clic en la imagen para ampliar)