martes, 14 de marzo de 2017

Corrección de viñeteo y dominantes en fotografía con R

En 'Análisis de viñeteo en ópticas con R' estudiamos la pérdida de luminosidad en las zonas periféricas que se produce cuando se toman fotografías con diafragmas muy abiertos en la óptica.

Existe un caso mucho más extremo de "viñeteo", y es el introducido por los filtros de densidad neutra. Estos accesorios permiten reducir enormemente la cantidad de luz que llega a la cámara para hacer exposiciones de larga duración, en las que cualquier fluido en movimiento (agua, humo, nubes,...) se vaporiza como en esta fotografía de Darren Moore.

'Curvature'. Darren Moore, 2014.

Pero todo tiene un precio y estos filtros, muy especialmente los variables basados en polarizadores como el usado en la prueba, introducen fuertes patrones de viñeteo y dominantes de color indeseadas que pueden hacer la imagen inutilizable cuando se usan con las atenuaciones más fuertes.



Vamos a ver lo fácil que es librarnos de las sombras en las zonas laterales, así como de las dominantes de color azuladas que provoca el filtro en esta imagen con unos pocos comandos en R, y sin hacer ningún procesado manual sobre la fotografía.

El motivo se ha escogido para que la captura no se alargase demasiado ya que se ha usado el filtro en una posición cercana a su extremo, reduciendo la luminosidad a 1/80 de la luz incidente.

Para obtener el patrón de luminosidad y dominantes introducidas por el filtro basta hacer una captura sobre una superficie de color lo más uniforme posible, en este caso una pared.



Usar este patrón para eliminar el efecto de la no idealidad del filtro sobre la imagen, es tan sencillo como corregir al alza la luminosidad de cada píxel de la fotografía para compensar la pérdida que provocó el filtro y que queda cuantificada en este patrón.

Las facilidades de R para procesar fotografías de forma vectorial sin acudir a bucles para recorrer la imagen, reducen el código a unas líneas:

    # Librería imágenes en 16 bits
    library(tiff)

    # Leemos patrón de viñeteo
    vignet=readTIFF("vignet.tiff", native=F,
      convert=F)

    # Normalizamos cada canal
    for (i in 1:3) vignet[,,i]=
      vignet[,,i]/max(vignet[,,i])

    # Aplicamos corrección y guardamos normalizando
    scene.out=readTIFF("scene.tiff")/vignet
    writeTIFF(scene.out/max(scene.out),
      "scene.out.tif",
      bits.per.sample=16, compression="LZW")


La corrección de dominantes de color adicional a la de luminosidad, se logra gracias a que el procesado se aplica de forma independiente para cada canal RGB. El resultado de la corrección es muy bueno:



Las imperfecciones con seguridad se deben al poco cuidado puesto a la hora de obtener el patrón de corrección, ya que la superficie usada estaba lejos de tener una iluminación completamente uniforme.

Un parámetro interesante de calcular es el aumento de luminosidad requerido en el procesado para compensar la asimetría del filtro. El motivo es que cuanto más se haya tenido que corregir la exposición de una determinada zona, más ruido puede aparecer en la imagen.

La siguiente figura muestra para el canal R, las exposiciones relativas en pasos (un paso implica el doble de nivel) respecto al máximo, referenciado como 0. Estos son los valores por los que se hubo de aumentar la luminosidad en cada área para eliminar los defectos de la imagen.



En el enlace ndfilter.R puede encontrarse todo el código usado. Este artículo está dedicado a Paq-illo que hoy cumple años; felicidades hombre de negro!.

1 comentario:

  1. Es bestial las aplicaciones que tiene R en campos tan diversos!! gracias por la info

    ResponderEliminar

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.