En
un mensaje anterior he presentado una imagen tratada con técnicas HDR, a raíz de la cual me he comprometido a realizar un manuelillo -éste- para mostrar los pasos que he seguido.
Este manuelillo es una versión personalizada
del original de Edu Pérez para manejar HDR con software libre. Entre otras (pequeñas) diferencias, aquí se obienen los fotogramas de distintas exposiciones de un único
rau. También se realiza
todo el proceso a 16 bits incluyendo la mezcla de capas, a diferencia del de Edu, que mezcla las capas a 8 bits con gimp.
En cualquier caso, sugiero abrir el enlace anterior en una pestaña próxima para ir consultando las referencias que se irán citando aquí.
Programas y paquetes necesariosSe van a necesitar los siguientes programas/paquetes:
* imagemagick
* enfuse
* dcraw
* ufraw
* pfstools
* pfstmo
* gimp (opcional, para guía del proceso de mezcla final)
* pfscallibration
Este último paquete no se encuentra disponible en repositorios, al menos en Debian (incluso en sid/experimental) y Ubuntu 10.10. Habría que
descargarlo y compilarlo. En ese caso se necesita otro paquete más:
libpfs-dev.
De todas formas, de
pfscallibration se usan solamente 2 scripts. El primero,
dcraw2hdrgen, hace una cosa muy tonta que se puede reproducir a mano (ver más abajo). El segundo,
pfsinhdrgen es un script en
perl que invoca programas contenidos en los otros paquetes; por lo que sospecho que copiándolo en el directorio local de ejecutables funcionaría perfectamente.
1) Obtención de fotogramas de diferente exposiciónEn este punto Edu tira de
dcraw sobre los
raus tomados en vivo. Como aquí sólo tenemos una imagen, nos toca "abusar" de ella. Además, lo haremos con
ufraw, que tiene la ventaja que nos permite hacer algún tratamiento previo como ajuste de blancos (altamente recomendable), curva de entrada, lensfun, corrección de inclinación, recorte, etc.
Abrimos el
rau con
ufraw. Aparte de los tratamientos citados, yo sugiero NO meter mucho
jierro en este punto. Particularmente: gamma y linealidad las que uséis por defecto; curva de salida recta con ajuste del punto negro a 0 (atención, esto es MUY importante: no poner el punto negro en automático, ni tampoco el ajuste de blancos, exposición, etc). Se puede jugar con el valor de exposición, pero yo recomiendo dejarlo a 0 o bien moverlo, como mucho, a +-0,5 puntos. La saturación conviene no subirla, ya que el procesado posterior lo hará por sí mismo; en el ejemplo que presento se me olvidó este paso y dejé la saturación en 1,25; pero mejor, porque así os enseño un truquillo para evitar saturaciones exageradas.
Salvamos el resultado como TIF de 16 bits y elegimos la opción de guardar el fichero de configuración. La imagen obtenida en mi caso fue esta:
Ahora abrimos el fichero de configuración de nuevo (OJO: el fichero de configuración obtenido en el paso anterior, no el
rau), con
ufraw y cambiamos el valor de exposición restando, digamos, 1 al valor que tenía. En la pestaña de fichero renombramos a algo que evidencie el contenido, por ejemplo, nombreoriginal-1.tif y salvamos (con configuración incluida).
Repetimos haciendo lo mismo pero sumando 1 a la exposición y volviendo a renombrar (nombreoriginal+1.tif). Y así las veces que queramos. En el ejemplo que presento se han obtenido 5 fotogramas en total desde -2 a +2 de exposición.
Para las imágenes sobreexpuestas puede que veamos la necesidad de incrementar un poco el parámetro de
wavelet denoising. Sin problema.
2) Creación del fichero hdrgen.txtSiguiendo los pasos y la notación de Edu, procedemos ahora a la obtención de un fichero de texto
hdrgen.txt. Para eso hacemos:
$ dcraw2hdrgen nombreoriginal.RAW > hdrgen.txt
donde la extensión .RAW la adaptáis a la que utilice vuestra cámara.
Abriendo con un editor de texto
hdrgen.txt vemos que la estructura de los datos es muy sencilla:
nombreoriginal.RAW 100.0 8.0 100 0Cambiamos .RAW por .tif
nombreoriginal.tif 100.0 8.0 100 0Ahora tenemos que fijarnos que esos datos reflejan los valores de la exposición de la toma de acuerdo a este formato:
fichero<espacio>velocidad de obturación<espacio>apertura<espacio>ISO<espacio>0Tenemos que tener una línea por cada fotograma obtenido. Ya tenemos la del primero. Para los demás copiamos la línea original cambiando el nombre del fichero al del fotograma correspondiente, y los parámetros de la toma, de forma que reflejen la nueva exposición asignada con ufraw. Esto yo lo hago cambiando el parámetro velocidad, que es el más intuitivo, y dejando el resto igual. El cambio de velocidad de obturación se hace de acuerdo con estas sencillas reglas:
- Multiplicar por 2 tantas veces como se haya subexpuesto el fotograma
- Dividir por 2 tantas veces como se haya sobreexpuesto el fotograma
Así, el fichero
hdrgen.txt nos quedaría de esta forma:
nombreoriginal.tif 100.0 8.0 100 0
nombreoriginal-1.tif 200.0 8.0 100 0
nombreoriginal-2.tif 400.0 8.0 100 0
nombreoriginal+1.tif 50.0 8.0 100 0
nombreoriginal+2.tif 25.0 8.0 100 0
Como veis, no se necesita para nada el script
dcraw2hdrgen, sino que sabiendo los datos EXIF de la toma original el fichero
hdrgen.txt se puede crear "a pinrel".
3) Creación del HDR, enfuse y "toneados"A partir de ahora ya podemos automatizar el proceso con scripts, pero por el momento seguiré describiendo el proceso paso a paso. Toda esta sección es prácticamente idéntica a como la describe Edu en su manuelillo. Por cierto, nos ahorramos el paso de alinear los fotogramas con
align_image_stack puesto que todos proceden del mismo original

Tenemos que obtener una imagen HDR, y otras 3 normales: una a partir de
enfuse, que mezcla las imágenes eligiendo el pixel mejor expuesto de todos los fotogramas, y otras 2 "toneando" el HDR. El HDR se obtiene con:
$ pfsinhdrgen hdrgen.txt | pfsout pfs.hdr
Aplicamos
enfuse:
$ enfuse -o enfuse.tif nombreoriginal*.tif
Cuyo resultado en mi ejemplo es este:
Para los "toneados" he elegido los mismos que Edu, con los mismos parámetros (¡os invito a probar otros! yo aún no he tenido tiempo), esto es:
mantiuk06 y
fattal02. Los comandos los he calcado del colega:
$ fsin pfs.hdr | pfstmo_mantiuk06 -e 1 -s 1 | pfsgamma --gamma 2.2 | pfsoutimgmagick pfstmo_mantiuk06.tif
$ pfsin pfs.hdr | pfstmo_fattal02 -s 1 | pfsoutimgmagick pfstmo_fattal02.tif
Así es como queda el toneado
mantiuk06:
que tiene el típico aspecto fantasmal de los HDR, pero con gran detalle en las texturas; por cierto, Edu Pérez dice que da un resultado parecido al de
enfuse 
...
Y ésta otra es
fattal02:
que es un pastiche de colorines aparentemente poco usable.
Todo esto se puede juntar en un script que creo en la propia carpeta con un nombre identificativo (excavadora-hdr.sh); el script aún no lo tengo parametrizado, sino que creo uno para cada caso (con copia-pega es muy fácil), adaptándolo para la ocasión:
#!/bin/sh
# Descomentar la siguiente línea para volver a generar fotogramas
# ufraw-batch *.ufraw
pfsinhdrgen hdrgen.txt | pfsout pfs.hdr
enfuse -o enfuse.tif nombreoriginal*.tif
pfsin pfs.hdr | pfstmo_fattal02 -s 1 | pfsoutimgmagick pfstmo_fattal02.tif
pfsin pfs.hdr | pfstmo_mantiuk06 -e 1 -s 1 | pfsgamma --gamma 2.2 | pfsoutimgmagick pfstmo_mantiuk06.tif
4) Mezcla de imágenesAhora toca mezclar el resultado de
enfuse y los "toneados". Para ello sigo provisionalmente las instrucciones de Edu, abriendo el
gimp con esas tres imágenes como capas. De abajo a arriba:
enfuse.tif,
pfstmo_mantiuk06.tif (en modo "solapar", 50 de opacidad) y
pfstmo_fattal02.tif (también en modo "solapar", 50 de opacidad); a partir de ahí voy jugando con los parámetros.
Lo primero que he notado es que muchas veces conviene mezclar la capa
mantiuk06 en modo "normal" porque así se reflejan mejor las texturas que da este "toneado". Y también he notado que la capa
fattal02 sube mucho la saturación total de la mezcla, por lo que muchas veces tengo que rebajarla para que me de un resultado aceptable. En el ejemplo que presento esto es mandatorio, puesto que por error generé los fotogramas base ya subiditos de saturación

Tomo nota de lo realizado en
gimp (opacidades, modos de fusión y rebaja de saturación de
fattal02) y paso a trabajar en 16 bits con
imagemagick; para ello me construyo el siguiente script, que llamo "excavadora-mezcla.sh", en la misma carpeta:
#!/bin/sh
convert enfuse.tif pfstmo_mantiuk06.tif -compose blend -define compose:args=50 -composite - | \
convert - \( pfstmo_fattal02.tif -modulate 100,50 -clone 0 -compose Overlay -composite \) \
-compose blend -define compose:args=50 -composite -unsharp 5x1+0.8 -quality 96 excavadora.jpg
exiftool -overwrite_original -tagsfromfile nombreoriginal.RAW excavadora.jpg
Como veis, son 2
convert "entubados" que hacen el mismo trabajo de fusión de capas de gimp, pero directamente a 16 bits. La primera línea combina de modo "normal" la base
enfuse.tif con el toneado
mantiuk06 y lo escupe a "stdout"; el valor detrás de "args=" debe coincidir, en primera instancia, con el valor de opacidad de la mezcla de la capa
mantiuk06 que habéis usado en
gimp.
La segunda línea recoge el proceso anterior y lo combina en modo "solapar" (Overlay) con el toneado
fattal02; entre medias, he aplicado a esta última la orden
-modulate 100,50 que cambia el brillo y saturación de la imagen; en este caso el brillo vale 100 (que significa "sin cambios") y la saturación 50 (esto es, rebaja al 50% de la saturación original).
La tercera línea mezcla este solapamiento con el valor de opacidad usado para la capa
fattal02 en
gimp; este valor es el que se pone detrás de "args=". También aprovecho para aplicar una máscara de "afilar" suave y volcar el resultado a jpg. En este punto alguien podría volcar el resultado aún en 16 bits para aplicar otros procesados posteriores. O salvar en tif de 8 bits para imprimir luego... todo ello es muy configurable.
Una vez visto el resultado, es casi seguro que sale distinto al de
gimp; generalmente sale más contrastado, por lo que toca refinar "a pelo" los valores de opacidad y rebaja de saturación usados en el script; tras un par de pruebas se obtiene ya algo muy parecido al
gimp (o no, pero que te gusta más que lo del
gimp...), pero con un histograma "suave", sin efecto peine ni otras barrabasadas que ocurren a 8 bits. Este script es rápido, en comparación con el anterior que es bastante pesado, con lo que resulta muy ágil hacer pruebas.
Este es el resultado para el ejemplo que he estado usando, con los datos que aparecen en el script de arriba:
La última línea del script aprovecha para incrustar de nuevo los datos EXIF, que se han perdido con tanto barullo

Para finalizar, espero haber sido lo suficientemente claro como para que los interesados no sólo repitan los pasos, sino que los adapten a su forma particular de trabajar. De lo único que sí que me gustaría haber cambiado en algo vuestro flujo de trabajo (o vuestra forma de pensar) es en que ahora estéis pensando alargar los procesados el mayor número de pasos posibles en 16 bits

También espero que esto sea útil para quien quiera introducirse en el mundillo HDR con software libre.
P.S. Seguramente tendré que editar para corregir
apracidades y otras cosillas...