2009/04/23

Un script para hacer HDR en Linux

This article is also available in English: Script to make HDRs with Linux.

En el artículo HDR en Linux expliqué mi flujo de trabajo para hacer HDR en Linux. Continuando con ese tema, en este artículo presento el script uso habitualmente para automatizar este proceso en una única llamada.

El código del script en cuestión es el siguiente:

#! /bin/bash

set -e

SELF=`basename $0`

DIR=.
ALIGN=N
ENFUSE=N
TONEMAP=N

echo "$SELF: `date`"

while [ "$1" != "" ]; do
 case "$1" in
  "-a")
   ALIGN=Y
   ;;
  "-e")
   ENFUSE=Y
   ;;
  "-t")
   TONEMAP=Y
   ;;
  "-d")
   DIR="$2"
   shift
   ;;
  *)
   echo "$SELF: Parameters"
   echo "$SELF:  -d      -> Directory"
   echo "$SELF:  -a      -> Align images"
   echo "$SELF:  -e      -> Create enfuse"
   echo "$SELF:  -t      -> Create and tonemap HDR"
   exit
   ;;
 esac

 shift
done

HDR="$DIR"/HDR
FILES=("$DIR"/*.[Cc][Rr]2)
COUNT=${#FILES[@]}

echo "$SELF: Options:"
echo "$SELF:  Directory  = $DIR"
echo "$SELF:  Output     = $HDR"
echo "$SELF:  Align      = $ALIGN"
echo "$SELF:  Enfuse     = $ENFUSE"
echo "$SELF:  Tonemap    = $TONEMAP"
echo "$SELF:  Files      = ${FILES[*]}"

if [ $COUNT -eq 0 ]; then
 echo "$SELF: No files found!!!"
 exit 1
fi

echo "$SELF: Creating output directory:"
mkdir "$HDR"

echo "$SELF: Parsing EXIF information:"
dcraw2hdrgen ${FILES[*]} > "$HDR"/pfs_raw.hdrgen

echo "$SELF: Generating TIFFs"
ufraw-batch --wb=camera --gamma=0.45 --linearity=0.10 --exposure=0.0 --saturation=1.0 --out-type=tiff --out-depth=16 --overwrite --out-path="$HDR" ${FILES[*]}

FILES=("$HDR"/*.tif)

if [ "$ALIGN" = "Y" -a $COUNT -gt 1 ]; then
 echo "$SELF: Aligning images"
 align_image_stack -a "$HDR"/AIS_ ${FILES[*]} > "$HDR"/align_image_stack.log
 rm -f ${FILES[*]}
 FILES=("$HDR"/AIS_*.tif)
fi

if [ "$ENFUSE" = "Y" ]; then
 if [ $COUNT -gt 1 ]; then
  echo "$SELF: Generating enfuse:"
  enfuse -o "$HDR"/enfuse.tif ${FILES[*]} > "$HDR"/enfuse.log
 else
  echo "$SELF: By-passing enfuse:"
  ln ${FILES[*]} "$HDR"/enfuse.tif
 fi
fi

if [ "$TONEMAP" = "Y" ]; then
 echo "$SELF: Parsing hdrgen"
 i=0
 > "$HDR"/pfs_tif.hdrgen
 cat "$HDR"/pfs_raw.hdrgen | while read LINE; do
  echo "${FILES[$i]} $LINE" | cut -d' ' -f1,3- >> "$HDR"/pfs_tif.hdrgen
  i=`expr $i + 1`
 done

 echo "$SELF: Generating HDR:"
 pfsinhdrgen "$HDR"/pfs_tif.hdrgen | pfsout "$HDR"/pfs.hdr

 echo "$SELF: Tone-mapping HDR:"

 echo "$SELF:  Operator = mantiuk06"
 pfsin "$HDR"/pfs.hdr | pfstmo_mantiuk06 -e 1 -s 1 | pfsgamma -g 2.2 | pfsout "$HDR"/pfstmo_mantiuk06.jpg

 echo "$SELF:  Operator = fattal02"
 pfsin "$HDR"/pfs.hdr | pfstmo_fattal02 -s 1 | pfsout "$HDR"/pfstmo_fattal02.jpg
fi

echo "$SELF: Cleanning:"
rm -f ${FILES[*]}

Es script está preparado para usarse con los ficheros RAW generados por una Canon 400D, pero creo que es fácilmente adaptable a otras cámaras. En concreto, donde dice "FILES=("$DIR"/*.[Cc][Rr]2)" se están seleccionando los ficheros con extensión "CR2", que son los que generan todas las cámaras Canon (Nikon utiliza la extensión "NEF", por ejemplo); y los parámetros "--gamma=0.45 --linearity=0.10" que se le pasan a "ufraw-batch" son específicos de la 400D. El resto creo que debería ser bastante genérico.

Lo primero que hay que hacer es bajarse el código al ordenador y guardarlo en un fichero que podamos ejecutar. Supongo que lo más sencillo es conectarse como usuario "root" y crear un fichero llamado "hdr.sh" en el directorio "/usr/local/bin/". Entonces seleccionamos y copiamos el código, lo pegamos en el fichero, y lo guardamos; finalmente hay que ir a la línea de comandos y dar permisos de ejecución con "chmod +x /usr/local/bin/hdr.sh".

Para utilizarlo, el primer paso es descargar en un directorio vacío todas las exposiciones de una escena que queramos juntar. Entonces ejecutamos el script con "hdr.sh -d _directorio_ -a -e -t". Lo dejamos que trabaje un rato, y cuando acabe tendremos tres ficheros nuevos en nuestro directorio: "enfuse.tif", "pfstmo_mantiuk06.jpg", y "pfstmo_fattal02.jpg".

El parámetro "-a" sirve para alinear automáticamente las imágenes; si hemos hecho las fotos con trípode y estamos completamente seguros de que están perfectamente alineadas, podemos quitarlo y el script acabará antes. Con "-e" indicamos que debe generarse la versión enfuse, y también podemos quitarlo si sabemos que no vamos a usarla; análogamente, podemos quitar el parámetro "-t" si no queremos que se haga el mapeo de tonos.

2009/07/27: He actualizado el artículo, para mejorar el paso del mapeo tonal, usando parámetros que generan un mejor resultado; también lo he ampliado para poder generar HDRs a partir de una única foto.

2009/09/21: Vincent Tassy ha publicado una versión mejorada de este script; su versión genera autoáticamente el fichero GIMP al final del proceso (un detalle muy interesante), y puede generar HDRs a partir de ficheros JPEG (yo no suelo usar JPEG, sólo RAW, sin embargo). Su versión es mejor que la mia, yo iría allí y la cogería: Linux script to generate HDR images from bracketed images.

0 commentarios:

Publicar un comentario en la entrada