jueves, 10 de noviembre de 2022

Apilado por 'antimediana' para replicar sujetos en movimiento en RAW

En el ejercicio 'Apilado por mediana para eliminar sujetos en movimiento en RAW' aprovechábamos las propiedades detectoras de outliers de la mediana para eliminar sujetos en movimiento. En esta ocasión le vamos a dar la vuelta a ese uso precisamente para preservar los sujetos en movimiento en una secuencia de imágenes.

Realizamos 11 capturas RAW en ráfaga sobre un corredor. El desplazamiento de éste hace que su presencia en cada fotograma represente una anomalía respecto a la serie, y sabemos que la eliminación de anomalías es la especialidad de la mediana.

Sin embargo en esta ocasión haremos lo contrario, buscaremos quedarnos en cada píxel del RAW con el valor más alejado de la mediana, proceso que bautizamos creativamente como 'antimediana' (hacer clic para verla al 100%):



El resultado puede descargarse de rawantimedian.dng. Sobre el mismo se puede hacer un par de apuntes:
  • Así como la mediana para eliminar sujetos que se mueven era (para mi sorpresa) super robusta en el sentido de que nunca producía artefactos de colores extraños, la antimediana es mucho más delicada: si el corredor se solapa consigo mismo en dos tomas (p.ej. zapatillas) se entremezclan valores RAW de varias tomas dando lugar a colores anómalos inexistentes en la escena.
  • También es muy sensible al movimiento (p.ej. hojas de los árboles y nubes), dando de nuevo lugar a múltiples artefactos en los bordes frontera.
  • Aunque no se ha dado en este ejemplo al ser las capturas de alta exposición (ISO100 derecheadas), cuando las capturas tienen baja exposición (ISOs altos) el ruido puede superar el umbral diferenciador que suponen los sujetos móviles, provocando que estos aparezcan salpicados de píxeles del fondo sin sujeto como en esta prueba en interiores.
  • Hablando de ruido, un efecto colateral negativo (como lo era positivo en la mediana), es que el archivo RAW resultante es más ruidoso que los originales ya que la antimediana precisamente busca los valores más desviados (=ruidosos) en cada píxel.

En el mapa de fusión de la antimediana identificamos por un tono de gris el RAW origen que suministró el dato en cada píxel (es necesario hacer clic par verlo en detalle), resultando las contribuciones: raw1.dng (11,41%), raw2.dng (8,12%), raw3.dng (6,95%), raw4.dng (5,64%), raw5.dng (5,82%), raw6.dng (5,86%), raw7.dng (5,55%), raw8.dng (13,57%), raw9.dng (7,13%), raw10.dng (7,53%) y raw11.dng (22,43%):



La última captura tiene mayor peso por acaparar las áreas quemadas del cielo (lo confieso, llevé el derecheo demasiado lejos). Las zonas de posible conflicto son bastante visibles en el mapa de fusión, y corresponden a zonas donde se alternan valores procedentes de RAWs diferentes cuando corresponden a distintos sujetos en la escena (p.ej. en los solapes del corredor consigo mismo, hojas en movimiento o nubes como dijimos):


~~~

Los problemas vistos, especialmente la creación de falsos colores en el demosaico, se pueden mitigar en gran parte con un procesado del mapa de fusión para forzar que fotositos cercanos provengan en la medida de lo posible del mismo archivo RAW (p.ej. el predominante en la zona).

Tomando en cada píxel del mapa de fusión la moda estadística (valor que más se repite) del conjunto formado por dicho píxel y los 8 o 20 vecinos que lo rodean, fácilmente eliminamos los píxeles espúreos que nos daban guerra en el corredor (hacer clic para ver los mapas de fusión al completo, incluyendo uno con moda de 49 píxeles):




El resultado en el corredor mejora hasta resultar prácticamente perfecto salvo en algunos píxeles frontera en los solapes del sujeto consigo mismo:




Los nuevos mapas de fusión tienen además un efecto de mejora en ruido al dejar de tomar explícitamente en cada píxel el valor más alejado (=ruidoso) de la mediana:


~~~

Para calcular la antimediana hemos usado la versión optimizada de la mediana que ya implementamos en C++ con Rcpp, reduciendo el tiempo de ejecución por un orden de magnitud respecto a la función de R base. El resultado mejorado para una moda de 21px puede verse en aquí o descargarse el RAW de rawantimedianmode9px.dng y de rawantimedianmode21px.dng.

Actualizamos la recopilación de apilados en RAW: por Media, por Mediana, por Máximo, HDR y ahora éste por Antimediana:



La antimediana por desgracia no existe en Photoshop (toma nota Thomas Knoll). En el tutorial 'Apilado por 'antimediana' para replicar sujetos en movimiento en Photoshop' hacemos una aproximación para tratar de replicar los cálculos que hemos hecho aquí.

~~~

Repositorio con todo el código R, script DNG, ejecutables de exiftool y dng_validate: GitHub.


2 comentarios:

  1. Hola, Guillermo.
    Un artículo en el blog de Fotochismes me trajo hasta aquí.
    En Photoshop no veo el modo de fusión "antimediana".

    ResponderEliminar
    Respuestas
    1. Pues aqui lo tienes:

      https://www.overfitting.net/2022/11/apilado-por-antimediana-para-replicar_18.html

      Eliminar

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.