[Comunidad FotoLibre]

Ayuda => Manuales => Mensaje iniciado por: Manolo en 16 nov 2010, 13:09 pm

Título: Manuelillo: HDR en Linux a 16 bits
Publicado por: Manolo en 16 nov 2010, 13:09 pm
En un mensaje anterior (http://comunidad.fotolibre.net/index.php/topic,6253.0.html) 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 (http://fotoblog.edu-perez.com/2008/10/hdr-en-linux.html). 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 (http://"http://sourceforge.net/projects/pfstools/files/") 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:

(http://img573.imageshack.us/img573/2923/dsc0032700.jpg)

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: [Seleccionar]
$ 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 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:


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: [Seleccionar]
$ pfsinhdrgen hdrgen.txt | pfsout pfs.hdr
Aplicamos enfuse:

Código: [Seleccionar]
$ enfuse -o enfuse.tif nombreoriginal*.tif
Cuyo resultado en mi ejemplo es este:

(http://img705.imageshack.us/img705/8323/enfuse700.jpg)

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: [Seleccionar]
$ 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:

(http://img249.imageshack.us/img249/812/pfstmomantiuk06700.jpg)

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:

(http://img89.imageshack.us/img89/6095/pfstmofattal02700.jpg)

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: [Seleccionar]
#!/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á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: [Seleccionar]
#!/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:

(http://img89.imageshack.us/img89/3617/sexcavadora700.jpg) (http://u1.ipernity.com/17/26/28/9442628.671d8608.1024.jpg)

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...
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: JoRdi en 16 nov 2010, 14:00 pm
Buenas,

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

Ta lu3go
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: dodecaedro en 16 nov 2010, 14:46 pm
se agradece mucho....
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: jofial en 16 nov 2010, 18:27 pm
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 (http://comunidad.fotolibre.net/index.php/board,9.0.html)

Saludos

Jose
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Medyr en 16 nov 2010, 18:47 pm
Gracias apañero  :colegas:
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: invisible en 16 nov 2010, 20:29 pm
Muy bueno, Manolo. Ya me lo estudiaré con detenimiento.

Por cierto, el enlace al manual de Edu Pérez no va muy fino... :)o

Saludos y creo que los administradores deberían estudiar si merece la chincheta, pero si entiendo que debería estar en Manuales (http://comunidad.fotolibre.net/index.php/board,9.0.html)
¡Faltaría más! ;)
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Enhy en 16 nov 2010, 21:06 pm
Qué buena pinta Manolo, a ver si tengo un ratito para echarle un vistazo con calma, pero a juzgar por el ejemplo promete mucho.
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Manolo en 16 nov 2010, 21:09 pm
Por cierto, el enlace al manual de Edu Pérez no va muy fino... :)o

Es la tercera vez que lo corrijo  :girl_mad: A ver si ahora chuta.

Gracias a todos por vuestra acogida al manuelillo, y también por ponerlo en la sección de manuales. Simplemente espero que sea de utilidad a la comunidad y que pronto veamos desatarse el talento escondido de los fotolibreros  :-XX
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: tat en 17 nov 2010, 05:48 am
Ando muy liado y no me da tiempo a leerlo pero a priori tiene una pinta estupenda. Muchas gracias por el aporte  q:)
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: tomas.senabre en 17 nov 2010, 20:05 pm
Peaso de Manuelote, muchas gracias. Lo quiero leer con detenimiento a ver si lo puedo aplicar con fotos más complicadas, donde exista de verdad diferencias de luminosidad de más de 5EV. Soy de los que piensa que HDR sí, pero para cuando se necesita, o sea, por necesidad, no por el efecto surrealista que tiene las patitas cortas.  :-)
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Manolo en 18 nov 2010, 14:12 pm
Peaso de Manuelote, muchas gracias. Lo quiero leer con detenimiento a ver si lo puedo aplicar con fotos más complicadas, donde exista de verdad diferencias de luminosidad de más de 5EV. Soy de los que piensa que HDR sí, pero para cuando se necesita, o sea, por necesidad, no por el efecto surrealista que tiene las patitas cortas.  :-)

Por mis experimentos, le veo por ahora 3 utilidades claras a este método:

1) Para hacer HDR de verdad, compensando diferencias exageradas de luminosidad. Casi mejor buscar los distintos fotogramas en la toma, aunque, si no tienes grandes zonas quemadas, un solo "rau" puede funcionar.

2) Para realzar texturas. Me he sorprendido yo mismo de las posibilidades del HDR para ello.

3) Para conseguir un efecto especial de ensoñación o surrealista como dices tú. En este caso conviene administrarlo con cuentagotas, como cualquier efecto especial: solarizados, posterizados, texturizados, filtro tipo seda de nylon, otros filtros artísticos, claves alta/baja, virados, etc
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Medyr en 18 nov 2010, 14:26 pm
Pregunta: ¿Qué método os parece mejor para tomar las imágenes HDR?

El de toda la vida: toma media mas menos otras dos simétricas.

Guillermo Luijk: Toma derecheando las luches sin tener nada quemado y a partir de esa medición, otras dos, siempre sobreesponiendo.

Este segundo método me parece especialmente curioso dado que en la primera tienes toda la información de las luces (nada quemado) y a partir de esto, a recuperar detalle en las sombras.

¿Qué pensáis?

 :??
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: tomas.senabre en 18 nov 2010, 18:46 pm
El de Guillermo  :-)
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: JoRdi en 18 nov 2010, 20:41 pm
Buenas,

¿Qué método os parece mejor para tomar las imágenes HDR?

La verdad es que yo no tengo ni idea, ni siquiera se cuantas tomas hay que hacer para componer un HDR, ¿3?, ¿4?, ¿más?, ¿menos?, lo único que se me ocurre, si quisiera componer un HDR con tres fotografías, es usar la herramienta ahorquillado automático de la exposición (AEB) que dispone la cámara (por lo menos esa opción existe en canon), puedes ahorquillar la exposición en incrementos de 1/3 de puntos durante tres disparos consecutivos. Si usas disparo en modo ráfaga, me parece, si no voy mal encaminado, que con accionar una vez el disparador harás las tres fotografías al instante, la normal, la sobreexpuesta y la subexpuesta, si por contra lo tienes en modo disparo a disparo tendrás que accionar tres veces el disparador para realizar las tres tomas diferentes (normal, sobreexpuesta, subexpuesta), no se si esta herramienta puede ayudar o no, cómo he dicho antes desconozco por completo cómo hacer un HDR.

Ta lu3go
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Manolo en 18 nov 2010, 20:54 pm
El de Guillermo  :-)

Estoy de acuerdo: el derecheado-sin-quemar-luces finalmente resulta en una foto subexpuesta globalmente, con lo que es más importante capturar las sombras con las siguientes exposiciones.
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Medyr en 19 nov 2010, 05:53 am
Hola Jordi

Creo que tienes razón en el modo de disparo. Yo tengo uno de los modos programables de la cámara (sin estrenar  :'( ese modo) para HDR, pero en el modo tradicional, creo que voy a mirar si puedo hacerlo en el modo "Guillermo" a ver si me deja la cámara que el referencia sea el más bajo.
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Manolo en 19 nov 2010, 06:50 am
Jordi, en principio yo pienso que 3 fotogramas es suficiente para empezar a hacer HDR. Fíjate que he dicho "fotogramas", no capturas porque podrías usar un solo "rau" para generar los otros fotogramas como explico en el manuelillo (eso sí, tiene que ser "rau", no jpg) aunque el braqueteado es mejor alternativa (hay que alinear luego las imágenes para corregir el posible movimiento de la cámara entre capturas).

En caso de usar sólo 3 fotogramas preferiría usar los extremos {+2,0,-2}, pero yo prefiero tirar de 5 fotogramas {+2,+1,0,-1,-2} más que nada para ayudar al algoritmo "enfuse" a buscar los mejores píxeles con los fotogramas intermedios.

Como he dicho, el "braqueteado" de tu cámara es una opción genial. Úsala sin miedo. Si puedes forzar a ±2 puntos de exposición para los extremos, mejor. Si no, hazlo con ±1 y fuerza a obtener los fotogramas de ±2 de exposición a partir de éstos.
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: JoRdi en 19 nov 2010, 09:21 am
Buenas,

Si puedes forzar a ±2 puntos de exposición para los extremos, mejor.

Se puede forzar sin ningún tipo de problema, se agradece la información q:)

Ta lu3go
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: Manolo en 22 nov 2010, 13:25 pm
Creo que es conveniente añadir algún enlace de otros manuelillos de fotolibre que ayudan a hacer HDR:

HDR para pobres (http://comunidad.fotolibre.net/index.php/topic,4741.0.html), de hombre_invisible. Mini-manuelillo para entender el programa 'enfuse'.

Script "mihdr.sh" (http://comunidad.fotolibre.net/index.php/topic,4806.0.html), de luispa. Básicamente es otra reinterpretación del manuelillo de Edu, compactada en un script muy profesional. Finalmente mezcla las capas en gimp.

Curiosamente, también mezcla la capa mantiuk06 en modo normal. Bueno, yo a veces encuentro más oportuno el modo "solapar" como sugiere Edu.

De lo que hace luispa, sólo tengo una objeción: el control del punto negro en "auto", en ufraw, nos va a dar problemas porque no "aclara" los negros en las fotos de mayor exposición. Por tanto las zonas originariamente subexpuestas seguirán igual.

Manuelillo de Qtpfsgui (http://comunidad.fotolibre.net/index.php/topic,4343.0.html) de charly morlock. El clásico programa gráfico para HDR en *NIX.

El Manuelillo (http://comunidad.fotolibre.net/index.php/topic,1056.0.html) (con mayúsculas) de Tomás Senabre. Para quien no lo conozca (¿existen esos seres?  :-XX) diré que ecualiza el rango dinámico a base de tratar por separado áreas de la imagen y después fusionándolas como capas con gimp.

He encontrado varias referencias a un programa propietario, el photomatix (¡sí! ¡en fotolibre!   :o ). Obviamente, no las repito por aquí...

P.S. Editado para añadir otro enlace
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: kallh en 22 nov 2010, 14:59 pm
Hola Manolo,

Estupendo Manual que te has currado!  :plas:

Y estupenda recopilación de enlaces de HDR.

Sí que me llama la atención el HDR, pero la verdad es que hasta que he leído tu manual y las respuestas de los compañeros me parecía un poco complicado para mis conocimientos y habilidades informáticas (lo de fotográficas también, pero con un buen horquillado automático de la cámara... :sonroja2:).

Hasta ahora lo único que había intentado, sobre todo por su sencillez, era el HDR para pobres de hombre_invisible (http://comunidad.fotolibre.net/index.php/topic,4741.msg46948.html#msg46948) (a ver si pongo las imágenes que utilicé, una a partir de un solo raw y otra con 3 disparos horquillados automáticamente por la cámara, aunque ni eran las adecuadas para ello ni tenían demasiado valor fotográfico).

Bueno, ahora ya no hay excusa, hay manuelillos abundantes para los más pobres,  los pobres a secas, y para los un poco menos pobres.  :)))

Gracias de nuevo y enhorabuena por el aporte.

Un saludo,  q:)

Andoni
Título: Re: Manuelillo: HDR en Linux a 16 bits
Publicado por: brunolas en 05 jul 2011, 15:22 pm
Muchas gracias. Muy útil.
De momento sólo una objeción: pfscallibration está mal escrito es: pfscalibration

Un saludo