-->

Ruby e Lisp Rubyk’s Cube?

HDR - High Dynamic Range

October 15th, 2006

hdr

1. Introdução

Quem possui uma câmera sabe que a foto obtida é um pouco diferente do que vemos. Enquanto nossos olhos podem ver uma grande gama de tonalidade e detalhes em áreas claras e escuras, na foto os detalhes são perdidos nas partes claras e escuras. Mesmo em câmeras mais sofisticadas, o fato é existente. Em algumas situações, o flash pode resolver ou minimizar o problema. Em outras, como uma paisagem, ele é inútil.

Mas existe uma forma de minimizar o problema e, até, conseguir resultados mais surrealistas. Basicamente precisamos obter imagens com boa definição nas diversas áreas claras e escuras da imagem e depois juntá-las. Existem diversos tutoriais sobre o assunto, mas vou deixar o meu aqui pois servirá também para minha referência futura. As informações são para o Linux e o processo se baseia em três etapas.

2. Obtenção das imagens

Para obtermos imagens com uma boa exposição das diversas áreas da fotografia, é necessário que a câmera possua um recurso de compensação de exposição ou um modo manual onde seja possível manter uma determinada abertura e alterar a velocidade para que possamos ter fotos com maior tempo de exposição (obtendo mais detalhes nas áreas escuras) e tempos menores de exposição (obtendo mais detalhes nas áreas claras). Algumas câmeras possuem o recurso de ‘auto bracketing’, isto é, compensamos a exposição em 2EV e ela obtém três fotos automaticamente (-2EV, 0, +2EV). Também é interessante a utilização de um tripé, para que as fotos fiquem todas alinhadas. Para o processo são necessárias, pelo menos, três fotos. Uma com a exposição correta, uma superexposta e outra subexposta.

3. Agrupar as imagens

De posse das imagens com as diferentes exposições no computador, chegou a hora de combiná-las em uma única imagem com toda a gama de tons conseguida. O processo pode ser simples e gerar automaticamente a imagem final ou podemos gerar a imagem com uma grande faixa dinâmica, proceder os ajustes necessários e gerar a imagem final posteriormente. Dependendo do formato escolhido, o resultado será uma imagem com 16 bits, 32 bits ou até a utilização de ponto flutuante por cor de pixel. Um formato interessante é o .exr, desenvolvido pela ILM (Industrial Light & Magic) que possui especificação e programas abertos ( Open EXR ). Basicamente podemos converter as imagens de três formas.

3a. CinePaint

Podemos utilizar o CinePaint ou a versão nova (Cinepaint Glasgow, quando sair) quando sair. Basta executar o programa e escolher File -> New from -> Bracketing HDR (YMMV). Selecione todas as imagens e pressione OK. Após a leitura, pressione o botão “Compute Response”, espere o processamento e pressione o botão “HDR”. A imagem resultante será mostrada e você poderá até trabalhar nela, ajustando cores, contrastes, gama, etc. Após, escolha a opção Image -> Alpha -> Add Alpha Channel. Depois escolha File -> Save As e informe o nome.exr. Para maiores detalhes, veja o tutorial sobre HDR. Como vantagem, podemos trabalhar na imagem e, ‘se‘ o resultado ficou bom, pode ser gerado o arquivo .jpg. Também não é necessário que as imagens possuam as informações (exif).

3b hdrgen

Utilizando o programa hdrgen. Basta executar o programa pela linha de comando no mesmo diretório onde encontram-se as imagens. O formato pode ser: hdrgen -o nome.exr -a -e *.jpg (irá converter todas as imagens do diretório; utilize uma máscara apropriada caso existam outras imagens). Junto com o programa vem uma página com informações sobre a utilização do programa. Apesar de alinhar automaticamente as imagens, o resultado é bem ruim. Em compensação, sem a opção -a ele consegue desalinha uma seqüência de fotos.

3c pfstools

Utilizando o pfstools que é um conjunto de ferramentas abrangendo todas as etapas do procedimento. O formato é parecido com o netpbm, isto é, possui diversos programas que realizam tarefas específicas e a saída de um pode ser utilizado como entrada em outro até que o processo seja finalizado. Para a criação de uma arquivo .exr, existe um exemplo na página do PFSCalibration. O básico seria algo como:

jpeg2hdrgen *.jpg > x.hdr
pfsinhdrgen x.hdr | pfshdrcalibrate -v -s x.response
pfsinhdrgen x.hdr | pfshdrcalibrate -v -f x.response | pfsoutexr x.exr

Primeiro geramos as informações de todos os arquivos .jpg do diretório. A segunda etapa é a geração de um arquivo com informaçãos sobre a calibração da câmera. Note que é necessário apenas uma vez. A qualidade do resultado será afetada apenas se outras imagens forem obtidas com uma sensibilidade diferente, alteração no balanço de branco ou, é claro, outra câmera.

4 Tone mapping

Como o formato padrão para a utilização de imagens em páginas é o .jpg, o último passo seria a conversão da imagem hdr para o formato .jpg. Como o formato jpeg trabalha com 8bits por cor, existem diversos algoritmos que fazem a conversão necessária. O processo chama-se ‘tone mapping’. Você pode utilizar o PFStmo para os diversos algoritmos. Se você desejar, poderá utilizar a linha de comando para aplicar o ‘tone mapping’ dos algorítmos. Mas não serei eu a explicar como utilizá-los. Na página do PFStmp existem alguns exemplos. O modo mais prático e flexível é utilizando a GUI qpfstmo. Com ela, você poderá utilizar os diversos algoritmos de ‘tone mapping’ de maneira simples. Basta especificar o arquivo .exr, escolher um tamanho para a imagem de trabalho e testar os diversos algorítmos com seus respectivos parâmetros. Também existe exemplos na página. Alguns darão imagens mais realistas, outros não, alguns funcionam melhor quando houver uma grande faixa dinâmica, outros não. Enfim, diversão garantida e alguns resultados interessantes para impressionar os amigos.

5.Conclusão

Acho que não tem nada para concluir. A única observação é sobre a utilização do pfstools que permitiria a criação de um script para a automação de todos os processos. Como desvantagem, o procedimento fica mais difícil de receber um ajuste mais detalhado. Um exemplo tosco de script para a cobertura de todos os procedimentos, poderia ser:

#!/bin/sh

if [ -z $1 ]; then
echo "Uso: hdr.sh "
exit 1
fi

tm=fattal02

jpeg2hdrgen *.jpg > $1.hdr
if ! [ -e ~/camera.response ]; then
pfsinhdrgen $1.hdr | pfshdrcalibrate -v -s ~/camera.response
fi

pfsinhdrgen $1.hdr | pfshdrcalibrate -v -f ~/camera.response | \
pfstmo_$tm | pfsgamma -g 1 | pfsout $1.jpg

Note que utilizei o algorítmo fattal02 e gerei um jpeg (o resultado será o mesmo da imagem no início do artigo). Com um pouco mais de trabalho e você poderá criar algo mais próximo ao qpfstmo. Mas aí já existe, então….

Também seria possível utilizar o script para gerar uma imagem .exr incluindo uma linha como:

pfsinhdrgen $1.hdr | pfshdrcalibrate -v -f ~/camera.response | \
pfsoutexr $1.exr

Apesar de não ser um tutorial, possui informações para quem deseja utilizar a técnica no Linux. Outras informações podem ser obtidas nos sites dos programas ou man pages dos mesmos.

Entry Filed under: Fotografia, Geral