Author Topic: MaskedStrecthTransform - Funcionamiento y principios básicos.  (Read 13747 times)

Offline C. Sonnenstein

  • PixInsight Addict
  • ***
  • Posts: 262
    • http://astrosurf.com/astro35mm
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.
Carlos Sonnenstein

Offline Ignacio.R.

  • PixInsight Enthusiast
  • **
  • Posts: 77
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #1 on: 2007 December 25 19:23:22 »
Bueno, esto no podia llegar en mejor momento  :wink:  
Muchas gracias Carlos y gracias tambien a David ya que ultimamente he seguido el hilo donde se fue desarrollando este script y tiene un curro enorme.

Saludos

Offline Jordi Gallego

  • PixInsight Addict
  • ***
  • Posts: 279
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #2 on: 2007 December 26 04:56:18 »
Gracias por la documentación Carlos (y David por el trabajo de dar forma al script) :wink:

Saludos
Jordi
Jordi Gallego
www.astrophoto.es

Offline Ignacio.R.

  • PixInsight Enthusiast
  • **
  • Posts: 77
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #3 on: 2007 December 26 05:03:59 »
Solo una sugerencia. ¿Se podria de alguna manera visualizar el progreso realizado a tiempo real? Es que a partir de 60 o 70 iteraciones se empieza a eternizar y no vendria mal poder ver cuanto va quedando....

Saludos

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #4 on: 2007 December 26 08:47:30 »
Carlos y David: Muy buen trabajo ;)

No estaría mal implementar este algoritmo como un módulo. ¿David?  8)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline Ignacio.R.

  • PixInsight Enthusiast
  • **
  • Posts: 77
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #5 on: 2007 December 26 10:49:53 »
Quote from: "Juan Conejero"
Carlos y David: Muy buen trabajo ;)

No estaría mal implementar este algoritmo como un módulo. ¿David?  8)


Se va a saturar la seccion de TransferCurves. :D  Ya es la mas cargada y con diferencia....

Offline bosch

  • PixInsight Addict
  • ***
  • Posts: 123
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #6 on: 2007 December 26 11:44:01 »
Hace una semana que utilicé este script a mi velo de javalambre con la friolera de 100 iteraciones y comprobé que en imágenes como estas en las que la nebulosa está inmersa en un mar de estrellas, es especialmente potente.
Antes sólo me atrecía a hacer 15 o 20 iteraciones pero 100...

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • http://www.astrosurf.com/brego-sky
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #7 on: 2007 December 26 12:51:13 »
Hola a todos,

Buen tutorial Carlos  :wink: , como en todas tus explicaciones: concisas y claras (ahora a hacer la versión en inglés :lol:  :lol: ) el script es genial (gran implementación la de David  :P  ).
Nosotros ya usamos alguna de las primeras versiones para nuestras M31 y M45 con la Canon, y ultimamente tanto el Pelicano como en la Pacman (ya con la Artemis) hemos usado la version final del script con grandes resultados. Realmente creemos que deberiais implementar un modulo oficial con el algoritmo del script.

Un saludo,

Oriol & Ivette

Offline Jordi Gallego

  • PixInsight Addict
  • ***
  • Posts: 279
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #8 on: 2007 December 27 02:36:00 »
Hola

Quote from: "Ignacio.R."
Solo una sugerencia. ¿Se podria de alguna manera visualizar el progreso realizado a tiempo real? Es que a partir de 60 o 70 iteraciones se empieza a eternizar y no vendria mal poder ver cuanto va quedando....


Ignacio, dos sugerencias mientras no se pone algo de lo que pides:

1) si pones el cursor sobre procesing console mientras está corriendo el script, ésta se abre y vas viendo lo que va haciendo.

2) Si mantines abierta la ventana de histogramas vas viendo en tiempo real como se va actualizando iteración a iteración :wink:

Saludos
Jordi
Jordi Gallego
www.astrophoto.es

Offline Ignacio.R.

  • PixInsight Enthusiast
  • **
  • Posts: 77
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #9 on: 2007 December 27 05:12:06 »
Quote from: "Jordi Gallego"
Hola

Quote from: "Ignacio.R."
Solo una sugerencia. ¿Se podria de alguna manera visualizar el progreso realizado a tiempo real? Es que a partir de 60 o 70 iteraciones se empieza a eternizar y no vendria mal poder ver cuanto va quedando....


Ignacio, dos sugerencias mientras no se pone algo de lo que pides:

1) si pones el cursor sobre procesing console mientras está corriendo el script, ésta se abre y vas viendo lo que va haciendo.

2) Si mantines abierta la ventana de histogramas vas viendo en tiempo real como se va actualizando iteración a iteración :wink:

Saludos
Jordi


Hola Jordi.

Es verdad. Lo de la opcion 2 lo lei hace unos dias y he querido probarlo. Como ya sabes de antemano hasta donde ha de llegar el histograma.... Lo que pasa es que cuando abro la consola MST nunca tengo abierta la de histogramas y siempre se me olvida  :oops:

Y la opcion 1 tambien la probare. Son de esas cositas que vas pillando a base de uso y que un dia descubres por casualidad y van muy bien.

Gracias

Quote from: "Bosch"
Hace una semana que utilicé este script a mi velo de javalambre con la friolera de 100 iteraciones y comprobé que en imágenes como estas en las que la nebulosa está inmersa en un mar de estrellas, es especialmente potente.
Antes sólo me atrecía a hacer 15 o 20 iteraciones pero 100...


A piñon!!!! Cuantas mas mejor. El resultado final aparentemente es muy similar pero el hecho de hacer 80 mascaras mas seguro que influye en la suavidad del resultado y siendo uno de los primeros procesos que hay que aplicar la finura es basica, por lo menos bajo mi punto de vista.

Saludos

Offline David Serrano

  • PTeam Member
  • PixInsight Guru
  • ****
  • Posts: 503
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #10 on: 2007 December 27 11:49:52 »
Quote from: "Jordi Gallego"
Hola

Quote from: "Ignacio.R."
Solo una sugerencia. ¿Se podria de alguna manera visualizar el progreso realizado a tiempo real?


1) si pones el cursor sobre procesing console mientras está corriendo el script, ésta se abre y vas viendo lo que va haciendo.


Al principio la consola se quedaba visible, pero descubrí que al ocultarla el script iba mucho más rápido (donde "mucho" es mucho). Había pensado en ponerle una barrita de progreso... a ver si me animo. No estoy teniendo un buen mes.


Quote from: "Juan Conejero"
No estaría mal implementar este algoritmo como un módulo. ¿David?


Ciertamente, no estaría mal :^P. Sin embargo el Common Lisp me llama más la atención que el C++. ¿Oriol?  :twisted:
--
 David Serrano

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #11 on: 2007 December 27 12:15:22 »
Quote
Ciertamente, no estaría mal :^P. Sin embargo el Common Lisp me llama más la atención que el C++.


Sacre bleu!  :roll:
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • http://www.astrosurf.com/brego-sky
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #12 on: 2007 December 27 13:37:01 »
Quote from: "David Serrano"
Ciertamente, no estaría mal :^P. Sin embargo el Common Lisp me llama más la atención que el C++. ¿Oriol?  :twisted:


 :lol:  :lol:  :lol: vaya,vaya,  :lol:  :lol: sois más peligrosos que mi jefe  :lol:  :lol:  :shock: ... la verdad es que si no me solapo con el trabajo de nadie, seria una buena manera de introducirme en la programación de módulos en PCL ya que ya un algoritmo que funciona.
Estos días he tendido un subidón de trabajo, pero el 'dead line' es el 31 de Diciembre, después volveré a tener tiempo y seguro que lo intento, ya veremos si con éxito o no?  :?

Offline Pep

  • PixInsight Addict
  • ***
  • Posts: 124
    • COELLO-PEDRAPIQUER
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #13 on: 2007 December 30 12:34:28 »
Hola,

Tengo una duda la respecto de este script, solo se aplica sobre imágenes RAW, o también se puede aplicar en imágenes TIF, ya que después de calibrar y sumar el resultado es TIF.

Saludos,
Pep Ferrer
Observatorio:
COELLO-PEDRAPIQUER
Callosa d'en Sarria (Alicante)

Offline C. Sonnenstein

  • PixInsight Addict
  • ***
  • Posts: 262
    • http://astrosurf.com/astro35mm
MaskedStrecthTransform - Funcionamiento y principios básicos.
« Reply #14 on: 2007 December 31 00:46:24 »
Hola Pep:

Este script puede aplicarse sobre cualquier tipo de imagen que pueda soportar PixInsight. Sin embargo es muy recomendable lanzar el proceso sobre un formato de archivo de al menos 32-bit enteros o 64-bit en punto flotante. De esta forma se evitan lo pequeños errores por redondeo. Para ello solo has de ajustar el formato desde SampleFormatConversion.

Un saludo y feliz fin de año.
Carlos Sonnenstein