Vamos a combinar estas dos imágenes del cometa Holmes, tomadas por mi amigo José Luis Lamadrid y yo:
30x15”:
26x1':
Los canales RGB de estas dos imágenes DSLR han sido reescalados para tener el balance de color apropiado, con una proporción de 1:2,22:2,86.
Como puede verse, la exposición de un minuto tiene la parte interior de la coma completamente saturada, por lo que vamos a utilizar la exposición de 15 segundos para recuperar la información perdida debido a las limitaciones de la cámara.
El primer paso es calcular el factor para acoplar ambas imágenes. Para hacerlo, necesitamos saber la iluminación de tres regiones de las imágenes: dos zonas con niveles diferentes de iluminación del cometa, y el nivel del fondo del cielo.
Crearemos en la imagen de un minuto dos pequeños previews que serán las referencias de iluminación para el cometa. Es importante evitar pixels con una iluminación demasiado alta (debido a una posible falta de linearidad en el sensor, especialmente con sensores dotados de ABG), o estrellas saturadas. Para una mejor visión de la imagen, podemos ajustar la ScreenTransferFunction, como mostramos abajo:
Debemos tener cuidado de poner el preview de baja iluminación en un área de suficiente señal, porque este preview tendrá mucho más ruido en la imagen de corta exposición. En este caso, los valores medios para los previews en esta imagen son:
preview _1min_high:
R: 0.2489940927
G: 0.3614411545
B: 0.4342339171
preview _1min_low:
R: 0.1453883686
G: 0.2159542766
B: 0.2605371721
Ahora debemos definir un preview sobre una región del fondo del cielo. Por lo tanto, vamos a hacer una STF más agresiva:
Ok, ahora tenemos definidas las tres regiones que necesitamos, pero necesitamos compararlas con la información de la exposición de quince segundos. Simplemente arrastra el selector del preview (la pestaña vertical con el identificador del preview) a la bandeja del selector de vistas de la otra imagen para duplicar los previews:
Convierte estos previews a imágenes independientes, arrastrándolos al fondo de la aplicación. Podemos renombrar los identificadores de las nuevas imágenes, como se ve abajo, e iconizarlas, porque ya no necesitaremos volver a mirarlas:
Ahora vamos a la maravillosa parte de las matemáticas. Escalaremos directamente la exposición de un minuto para acoplarla a la de quince segundos. Obviamente, usaremos el módulo de PixelMath. La ecuación que tenemos que escribir, según los identificadores que estamos utilizando, es la siguiente:
((_1min-Med(_1min_bg))*((Avg(_15sec_high)-Med(_15sec_bg))-(Avg(_15sec_low)-Med(_15sec_bg)))/((Avg(_1min_high)-Med(_1min_bg))-(Avg(_1min_low)-Med(_1min_bg))))+0.05
Esta ecuación multiplicará la imagen de un minuto por el factor de acople. Algunas notas sobre la ecuación:
Para las regiones del cometa, calculamos la media (la función Avg) de los valores de pixel, porque queremos saber la cantidad total de luz que la cámara está detectando. Sin embargo, para la región del fondo del cielo, calculamos el valor de la mediana (la función Med) para evitar errores de medida debidos al ruido y a estrellas presentes en el área.
En la ecuación, aplicamos el factor de acople a la imagen con el nivel de fondo del cielo sustraído, y después añadimos un pequeño pedestal (en este caso de 0,05) para preservar toda la información en las áreas más oscuras de la imagen.
Por supuesto, ¡debemos desactivar la opción de reescalar el resultado (“Rescale result”)!
Mandaremos el resultado a una nueva imagen, llamada 1min_rescale:
La imagen resultando, abajo, es muy oscura, ya que la estamos multiplicando aproximadamente por 0,25, y tiene los valores de mediana de sus canales RGB en 0,05:
Llegados a este punto, estamos listos para juntar ambas exposiciones. O no? Para cubrir las áreas saturadas de la exposición larga con la información de la exposición corta, podemos hacer una exposición de máximo. Pero si hacemos esto en toda la imagen obtendremos un resultado muy malo, porque la exposición de quince segundos tiene mucho más ruido en las áreas menos iluminadas que las mismas en la exposición de un minuto. Por lo tanto, !necesitamos una máscara!
Tenemos que recuperar la información en las áreas donde por lo menos uno de los tres canales RGB están saturados. El primer paso para hacer la máscara es calcular una imagen en blanco y negro donde cada pixels es el máximo de cada uno de sus valores RGB previos. La ecuación en PixelMath es bastante simple:
Max($target[0],$target[1],$target[2])
La salida de la instancia de PixelMath será una imagen de escala de grises, con el identificador “HDR_mask”. Debemos aplicar este cálculo a la exposición de un minuto original:
Esta es la imagen resultante:
Una vez tenemos la imagen en blanco y negro deseada, debemos decidir dónde está el límite de iluminación donde superpondremos la imagen de corta exposición. Esto puede conseguirse mediante una curva de transferencia (el módulo de CurvesTransform). En este caso, el límite lo fijamos en el valor de pixel de 0,7, con una zona de transición de +-0,05. Esta transición es importante para mitigar cualquier pequeño error en el factor de acople. Debido a la naturaleza de umbral de esta máscara, pienso que es mejor hacer la curva con una interpolación lineal:
Después de aplicar la curva, se obtiene esta imagen:
Es conveniente hacer la máscara un poco más suave. Esto se puede hacer fácilmente con la herramienta de À Trous Wavelet, deshabilitando las primeras capas:
Este es nuestro resultado final:
Finalmente, podemos activar la máscara en la exposición de un minuto escalada y superponer sobre ella la exposición de quince segundos. Para hacerlo, simplemente debemos sustituir la exposición de un minuto por la de quince segundos; es importante sustraer el nivel del fondo del cielo de la imagen de quince segundos y añadir el mismo pedesta (0,05) para que se acople correctamente a la otra imagen:
Este es nuestro resultado final:
Si elevamos los medios tonos, veremos mejor el rango dinámico entero: