En este artículo presento la culminación de un pequeño proyecto que me ha tenido ocupado algunas semanas. Se trata de implementar un supresor de efecto parpadeo para vídeos time-lapses (deflicker). Que yo sepa no existe ningún deflicker de software libre para Linux.
El timelapsing se presta a un montón de trabajo de postprocesado y si bien hay mucho software para eso, los scrips te abren siempre la puerta a hacer un tratamiento particular y muy original. Un deflicker no es algo demasiado especial, pero si lo suficientemente complejo como para demostrar la potencia de un buen script. En el vídeo se muestra la efectividad de este script.
Test para validar la eficacia de deflick.py from Antonio Castro on Vimeo.
¿Tiene algo de especial este deflicker?
En primer lugar, es software libre. En segundo lugar, la medición de la luz y el resto del trabajo está totalmente automatizado en otro tipo de deflickers, pero un programa que considere todo el fotograma en su conjunto además de ineficiente puede actuar de forma diferente a la pretendida.
Mi deflicker permite delimitar el recuadro donde el script mirará para actuar en la corrección de los fotogramas, lo cual es novedoso y bastante útil.
La primera versión es un programa en lenguaje python ‘deflick.py’ al cual hay que pasarle un directorio que ha de contener los fotogramas del timelapse, en segundo lugar un número que llamaremos NF, que determina el número de fotogramas previos y posteriores que serán promediados para obtener el valor de iluminación del fotograma a tratar, y después pasaremos unas coordenadas x1, y1, x2, y2 de un recuadro donde x1,y1 corresponden a la esquina superior izquierda y las coordenadas x2, y2 corresponden a la esquina opuesta de ese recuadro. La función de este será la de establecer una zona de referencia para que el programa la tome como zona estable. En ella se supone que los cambios bruscos de iluminación corresponderán a fenómenos globales no deseados. Es decir, serán tipo parpadeo. Para ello se tomará preferentemente una zona celeste. Si las nubes son de lenta evolución no serán un problema, pero objetos rápidos moviéndose en esa zona deben evitarse.
Un ejemplo de uso de este script sería el siguiente:
Desde la línea de comandos donde tengamos situado el directorio de los fotogramas tecleamos.
deflick.py 13 pru2 0 0 2784 400
Significado:
- NF=13
- Directo de los fotogramas= pru2
- coordenadas x1,y1, x2,y2 = 0 0 2784 400
El valor NF no afectará apenas a la velocidad del procesado. Un valor NF adecuado para muchos casos puede estar comprendido entre 10 y 20. El resultado de este comando sería un nuevo directorio con fotogramas ‘pru2_dflck’ en los cuales se ha eliminado el parpadeo.
Validación de los resultados:
Se ha desarrollado un segundo programa ‘test_deflick.py’ que permite comparar gráficamente el resultado obtenido con el original. Para ello genera una gráfica mediante un programa externo ‘gnuplot’ y también genera un vídeo con dos mitades construido con ayuda de ‘convert’ de ‘ImageMagick’ en las cuales se puede apreciar la diferencia entre el original y el resultado de la supresión del parpadeo. El vídeo de cabecera se obtuvo con este script, y se corresponde con la gráfica anterior.
Ejemplos para elección de un recuadro de referencia:
En una escena donde hay muchos objetos móviles en primer plano tomaremos un recuadro celeste. En un cielo nocturno con aparato eléctrico tomaremos un recuadro del primer plano para estabilizar la iluminación del primer plano. En Gimp y en otros editores gráficos, las coordenadas de las esquinas del recuadro de referencia pueden averiguarse posicionando el puntero del ratón en las posiciones deseadas de la imagen.
¿Cómo funciona?
El programa inicialmente mide la luz en cada recuadro de referencia (x1, y1, x2, y2) de cada fotograma, tal y como lo haría un fotómetro y almacena este valor de luz para cada fotograma. Se puede tomar como recuadro de referencia la imagen global, pero un recuadro que sea suficientemente representativo será más eficiente.
Después de almacenar el valor promedio de iluminación de cada fotograma medido en el recuadro, se producirá una segunda pasada que irá comparando el valor de cada fotograma con el promedio de sus NF fotogramas vecinos anteriores y los NF posteriores. De esa comparación se calcula el factor de multiplicación aplicable a la totalidad de los pixels del fotograma que estamos tratando para que coincida con ese valor promedio de sus fotogramas vecinos.
Hay que tener en cuenta que el parpadeo es un fenómeno que afecta a todos los pixels del fotograma por igual ya que deriva de diferencias en la exposición con la que se obtuvo cada foto. Véase artículo sobre el parpadeo: ¿Por qué aparece el parpadeo (flicker) en los time-lapses?
El resultado como ya dijimos es un nuevo directorio con fotogramas corregidos. Para pasar a vídeo los fotogramas de un directorio ya propusimos un sencillo script ‘dir2avi.py’ que puede verse afectado por un BUG que ya comentamos en su momento: Bug repartido entre ImageMagick, ffmpeg, mencoder, y recordmydesktop.
Por eso se incorpora ahora un nuevo script con más opciones que el anterior y que llamamamos ‘dir2vid.py’. Este permite anticipar el efecto del bug y trabajar con más formatos de vídeo además del avi, incorporar un audio mp3, usar determinados codecs de vídeo, usar imágenes que no vengan en jpg, etc.
Lo que he decidido es empaquetar todos estos scripts para poderlos descargar juntos, ya que ocupan muy poco. Podéis des cargarlo en uno de los tres formatos siguientes:
- pack_dflck.arj Ver:1.0 para Linux (8.43Kb)
- pack_dflck.tar.gz Ver:1.0 para Linux (5.62Kb)
- pack_dflck.zip Ver:1.0 para Linux (8.94Kb)
Para finalizar:
No me gusta hacer artículos demasiado técnicos y tengo la sensación de haber aburrido con tanta parrafada. A los desconocedores les vendrá grande y a los versados en estas cosas les basta el código fuente del programa que es bastante legible. Para no resultar pesado prefiero ir resolviendo dudas en los comentarios a hacer un artículo demasiado extenso y en su caso hacer algún anexo más adelante. A mí a diferencia de algunos gurús engreídos me encanta la labor didática con los novatos.