Ayuda > Manuales

Manuelillo: HDR en Linux a 16 bits

(1/5) > >>

Manolo:
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 necesarios

Se 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ón

En 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.txt

Siguiendo los pasos y la notación de Edu, procedemos ahora a la obtención de un fichero de texto hdrgen.txt. Para eso hacemos:


--- Código: ---$ dcraw2hdrgen nombreoriginal.RAW > hdrgen.txt
--- Fin del código ---

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 0

Cambiamos .RAW por .tif

nombreoriginal.tif 100.0 8.0 100 0

Ahora 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>0

Tenemos 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:


--- Código: ---$ pfsinhdrgen hdrgen.txt | pfsout pfs.hdr
--- Fin del código ---

Aplicamos enfuse:


--- Código: ---$ enfuse -o enfuse.tif nombreoriginal*.tif
--- Fin del código ---

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:


--- Código: ---$ 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

--- Fin del código ---

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 :-o ...

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:


--- Código: ---#!/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


--- Fin del código ---

4) Mezcla de imágenes

Ahora 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 :torpe:

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:


--- Código: ---#!/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


--- Fin del código ---

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 :-XX

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...

JoRdi:
Buenas,

¡Menuda currada Manolo! :buf: , el manual :-) , gracias por la aportación, seguro que más de uno le sacará provecho.

Ta lu3go

dodecaedro:
se agradece mucho....

jofial:
Hola Manolo,

Primero, agradecerte el trabajo en explicarnos como realizar un HDR en todos sus pasos y sin perder las ventajas de los 16 bitios.

Llevo un tiempo dándole vueltas a los 16 bitios (mientras esperamos pacientemente a GIMP) y leo con avidez tus manejos con imagemagick. Pero el command-line se me hace un poco farragoso.Una vez mas has conseguido despertar mi curiosidad. Gracias por ello.  q:)

Saludos y creo que los administradores deberían estudiar si merece la chincheta, pero si entiendo que debería estar en Manuales

Saludos

Jose

Medyr:
Gracias apañero  :colegas:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa