Hola a todos:
Aquí tenéis algo de documentación en castellano sobre
MaskedStretchTransform.
Utilidad del script MaskedStrechTransform - Funcionamiento y principios básicos.Una tarea imprescindible en cualquier trabajo de procesamiento de los datos
raw de una imagen CCD o DSLR de cielo profundo, es la transformación no-lineal de los datos mediante una transferencia de medios tonos (MTF). Esto se debe a que generalmente en una imagen
raw la distribución de los valores de píxel está limitada en una porción muy estrecha del rango dinámico próxima a las sombras. Este hecho impide representar correctamente las imágenes a través de cualquier dispositivo de visualización, bien sea una pantalla o soporte impreso.
Representar pues correctamente los detalles más débiles requiere aquí una MTF bastante agresiva. Este ajuste debería ser llevado a cabo en una única operación, como la opción más aconsejable en el sentido numérico, manejando un formato de archivo con el mayor número de bits posible. Sin embargo, aplicar esta operación implica generalmente un aumento en el tamaño de las estrellas y pequeños objetos brillantes de pequeña escala, llegando incluso a saturarse los píxeles más brillantes. Si lo que deseamos es evitar este efecto, lo más sencillo debe ser proteger estos detalles mediante una máscara.
Una máscara permite procesar una imagen de forma selectiva. Cualquier imagen puede trabajar como una máscara, siempre y cuando conserve las mismas dimensiones. Cuando se activa una máscara para una imagen, los píxeles negros de la máscara protegen completamente la imagen principal, mientras que los píxeles blancos de la máscara permiten procesar totalmente los píxeles de la imagen principal. Por lo tanto, píxeles grises de la máscara mezclarán proporcionalmente píxeles originales y procesados.
Extraer la luminancia a partir de los datos RGB suele ser el método más sencillo de generar una máscara, o bien duplicando la imagen principal si trabajamos con una imagen en escala de grises. Para que la máscara proteja convenientemente las luces, los valores de ésta deben ser invertidos. No obstante, aplicar una MTF agresiva protegiendo con una máscara a partir de los datos raw de una imagen CCD o DSRL de cielo profundo no es una buena idea, porque no protegerá la imagen lo suficiente si el resultado de aplicar la MTF difiere mucho de la imagen
raw. Es decir, la imagen utilizada aquí como máscara también tendrá las mismas características y propiedades que la imagen
raw, y la distribución de los valores de la máscara diferirán también en la misma medida del resultado de aplicar la MTF. Por lo tanto debemos buscar una una MTF mucho menos agresiva hasta alcanzar el valor deseado, pero protegiendo las estrellas y pequeños objetos brillantes mediante máscaras de luminancia invertida calculadas a cada iteración.
Como realizar manualmente operaciones de forma iterativa puede llegar a ser una tarea muy laboriosa, hemos automatizado aquí el proceso diseñando una rutina mediante un
script. Este
script lo llamamos
MaskedStretchTransform (MST) y dispone de su propia interface, junto a varios parámetros definibles por el usuario:
El mecanismo de
MaskedStretchTransform es bien simple: en primer lugar el usuario define la mediana resultante (
Target median), que es el parámetro que define el brillo general de la imagen final (valores en torno a 0.125 son los que proporcionan los valores típicos para el fondo del cielo), y luego ajusta las iteraciones (que aquí controla el número de veces que se calcula la máscara de luminancia invertida y se aplica la MTF correspondiente sobre la imagen) hasta llegar al valor de la mediana requerido.
Esto significa que cuanto mayor sea el número de iteraciones, más eficaz será la protección sobre las estrellas y pequeños objetos brillantes de pequeña escala, independientemente del valor seleccionado en el parámetro
Target median. Sin embargo, si el número de iteraciones no es ajustado correctamente el
script puede llegar a producir efectos no deseados. Esto es debido principalmente a que si lanzamos
MaskedStretchTransform sobre los datos
raw lineales, en imágenes CCD o DSLR la mediana final quedará con casi total seguridad demasiado lejos de la distribución inicial, lo que puede generar una desconexión entre los núcleos de las estrellas y su halo. Por otro lado, durante la aplicación del
script la máscara de luminancia calculada a cada iteración se vuelve cada vez más brillante, incrementándose sus valores de gris y añadiendo una protección adicional sobre los medios tonos, lo cual no es justamente lo que buscamos. Por este motivo hemos incluido el parámetro
Shadows clipping, el cual ayuda en parte a aislar mejor las altas luces de la máscara durante el proceso de protección.
El método de desenfoque o
blur únicamente afecta directamente a la máscara. Aquí hemos añadido también esta opción para perfeccionar el método de protección que se aplica a cada iteración de MST, de manera que se respeta mejor los perfiles de las estrellas y se evita también transiciones bruscas entre los bordes de los objetos fotografiados y el fondo. Si no se selecciona ningún método de desenfoque (
Blur method= None), los parámetros de wavelets y convolución no tendrán ningún efecto sobre el
script. Al elegir el método de desenfoque de la máscara por wavelets, hemos incluido dos parámetros básicos: número de capas que son deshabilitadas (
Wavelet layers to remove) y función de escalado (
Wavelet scaling function). El primer parámetro controla la intensidad del desenfoque de la máscara. Mayor número de capas deshabilitadas, mayor desenfoque, pero menor nivel de protección también frente a las altas luces. La función de escalado por otro lado, determina de qué forma las estructuras son aisladas en los wavelets en capas individuales. Aquí, una función de escalado es una distribución de valores en dos dimensiones. Por ejemplo, una distribución
gaussiana (forma de campana) puede ser una buena función de escalado en los wavelets. Pero cuanto más suave sea la función, más dificil será aislar las pequeñas estructuras. Por el contrario, una función de escalado menos suave (con un pico más pronunciado) aisla de forma más precisa las pequeñas estructuras de la imagen, pero también es más vulnerable al ruido. Sin embargo, hemos de decir aquí que el parámetro de función de escalado en este
script no es especialmente determinante, ya que aquí solo tratamos de desenfocar la máscara en mayor o menor medida. Por lo tanto, la función de escalado por defecto, suele dar generalmente buenos resultados.
Por último, el método de desenfoque de la máscara por convolución permite modificar el tamaño (
kernel) del filtro. Cuanto más grande es el tamaño, mayor intensidad de desenfoque obtenemos sobre la máscara. Hay que tener presente aquí que, si la máscara se convoluciona excesivamente, el nivel de protección sobre las altas luces puede disminuir significativamente. Esto es igualmente válido cuando se deshabilitan un número elevado de capas de wavelets desde el parámetro
Wavelet layers to remove.
Actualmente
MaskedStretchTransform es una utilidad reciente, pero creemos que el método puede ser perfeccionado en un futuro. Desde el principio, nuestra idea era crear una rutina que fuese relativamente fácil de implementar mediante el lenguaje JavaScript, con la principal finalidad de evitar que las estrellas y pequeños objetos brillantes de pequeña escala aumenten de tamaño significativamente, al efectuar el ajuste no-lineal de medios tonos que requiere una imagen de cielo profundo.
Desde aquí gracias a David Serrano por la confección del script y a Juan por incluirlo como utilidad en la plataforma principal de PixInsight.