Autor Tema: Manuelillo: HDR en Linux a 16 bits  (Leído 27373 veces)

Manolo

  • Bimilenari@
  • **
  • Mensajes: 2876
  • No dejes que la realidad te arruine una buena foto
    • Mi galeria en Ipernity
Manuelillo: HDR en Linux a 16 bits
« on: 16 nov 2010, 13:09 pm »
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: [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:

  • 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: [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:


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:


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


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...
« Última Modificación: 19 may 2012, 09:52 am por Manolo »
Ubuntu & Debian, Nikon D40X Nikon D5100
ufraw, photivo, imagemagick, gimp, pantools
Artículos y fotos bajo licencia CC-BY

JoRdi

  • Palizas oficial
  • *
  • Mensajes: 10191
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #1 on: 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

dodecaedro

  • Veteran@
  • *****
  • Mensajes: 559
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #2 on: 16 nov 2010, 14:46 pm »
se agradece mucho....
dodecaedro

jofial

  • Palizas oficial
  • *
  • Mensajes: 9513
  • Φ el · sobre la y
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #3 on: 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

Saludos

Jose
No hay nada peor que una imagen brillante de un concepto borroso.
Ansel Adams


Medyr

  • Palizas oficial
  • *
  • Mensajes: 5413
    • Apratizando
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #4 on: 16 nov 2010, 18:47 pm »
Gracias apañero  :colegas:
"Es hora de que nos empecemos a tomar en serio la fotografía y la tratemos como una afición"
Elliott Erwitt

invisible

  • Moderador
  • Palizas oficial
  • *****
  • Mensajes: 8097
    • INVItARTE
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #5 on: 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
¡Faltaría más! ;)
"Si quieres ver lo invisible, observa con atención lo visible."
                                                     Manuel Álvarez Bravo (1902-2002)

Enhy

  • Papá del Mes
  • Veteran@
  • *
  • Mensajes: 963
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #6 on: 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.
Mi instrumental
  • Canon EOS 350D: Mi juguete
  • Canon PowerShot S45: Mi primera cámara digital
  • EPSON Perfection 1650: La puerta al baúl de los recuerdos.
  • EPSON Stylus Photo R2880

Manolo

  • Bimilenari@
  • **
  • Mensajes: 2876
  • No dejes que la realidad te arruine una buena foto
    • Mi galeria en Ipernity
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #7 on: 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
Ubuntu & Debian, Nikon D40X Nikon D5100
ufraw, photivo, imagemagick, gimp, pantools
Artículos y fotos bajo licencia CC-BY

tat

  • Moderador
  • Palizas oficial
  • *****
  • Mensajes: 9622
  • Patch y buenas vibraciones
    • Libertat
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #8 on: 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:)

tomas.senabre

  • Papá del Mes
  • Trimilenari@
  • *
  • Mensajes: 3370
    • La Mirada Hecha Pedazos
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #9 on: 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.  :-)
"Hay tres maneras de adquirir sabiduría: primero, por la reflexión, que es la más noble; segundo, por imitación, que es la más sencilla; y tercero, por la experiencia, que es la más amarga". Confucio

Manolo

  • Bimilenari@
  • **
  • Mensajes: 2876
  • No dejes que la realidad te arruine una buena foto
    • Mi galeria en Ipernity
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #10 on: 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
Ubuntu & Debian, Nikon D40X Nikon D5100
ufraw, photivo, imagemagick, gimp, pantools
Artículos y fotos bajo licencia CC-BY

Medyr

  • Palizas oficial
  • *
  • Mensajes: 5413
    • Apratizando
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #11 on: 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?

 :??
"Es hora de que nos empecemos a tomar en serio la fotografía y la tratemos como una afición"
Elliott Erwitt

tomas.senabre

  • Papá del Mes
  • Trimilenari@
  • *
  • Mensajes: 3370
    • La Mirada Hecha Pedazos
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #12 on: 18 nov 2010, 18:46 pm »
El de Guillermo  :-)
"Hay tres maneras de adquirir sabiduría: primero, por la reflexión, que es la más noble; segundo, por imitación, que es la más sencilla; y tercero, por la experiencia, que es la más amarga". Confucio

JoRdi

  • Palizas oficial
  • *
  • Mensajes: 10191
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #13 on: 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

Manolo

  • Bimilenari@
  • **
  • Mensajes: 2876
  • No dejes que la realidad te arruine una buena foto
    • Mi galeria en Ipernity
Re: Manuelillo: HDR en Linux a 16 bits
« Respuesta #14 on: 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.
Ubuntu & Debian, Nikon D40X Nikon D5100
ufraw, photivo, imagemagick, gimp, pantools
Artículos y fotos bajo licencia CC-BY