Os Fundamentos da Fotografia Digital

Fotografia

1 Fundamentos da imagem digital:

Apresentamos aqui os conceitos básicos envolvidos em Processamento de Imagens Digitais e procuramos dar uma visão geral da área. Mas, não serão apresentadas técnicas de processamento em profundidade, nem pelo lado matemático, nem pelo lado computacional. Por isso mesmo, serve tanto a pessoas da área técnica que estão iniciando seu aprendizado em Processamento de Imagens, ou pessoas de Editoração Eletrônica que queiram aprender os conceitos que estão por traz de programas como o Adobe PhotoShop e o Corel PhotoPaint. Assim, qualquer um com conhecimentos básicos em computadores, pode compreender os conceitos aqui apresentados. Mas, o conceito matemático de função é largamente utilizado e é fundamental para o entendimento de algumas noções.

Os conceitos apresentados servem também como uma preparação para um texto mais avançado de Processamento de Imagens. Por esse motivo vários conceitos são tratados superficialmente para não tornar o texto ilegível para pessoas que não sejam da área técnica. Mas, uma das maiores dificuldades aqui é definir o que deve realmente ser superficial e o que não deve. Isso só a evolução desse material, através do retorno de pessoas que tenham acesso a ele, poderá dizer.

conceitos básicos:

Computação Gráfica e Processamento de Imagens: Antes de mais nada, precisamos nos situar dentro do contexto de Computação Gráfica. Estamos trabalhando basicamente com dois tipos de informação: Visual e Descritiva. Informação visual é por exemplo a imagem vista na tela do computador. Informação descritiva é referente ao modelo matemático que representa os objetos visualizados. A área de Processamento de Imagens em geral abrange operações que são realizadas sobre imagens e que resultam em imagens. A área de Visualização abrange as operações de síntese de imagem, ou seja, a geração de uma visualização do modelo. A área de Visão abrange as operações de análise dos objetos definidos pela imagem e a geração de modelos matemáticos desses objetos.

Aqui iremos ver várias funções de Processamento de Imagens e um pouco da interface desta área com as áreas de Visão e Visualização. Os programas de arquitetura, design e simulação gráfica, tais como as utilizadas em filmes com animação por computador abrangem as áreas de Modelagem e Visualização. Programas comerciais que representam muito bem esta área são o AutoCad e o Studio 3D, ambos da AutoDesk, e o Corel Draw da Corel.

Desta maneira, o modo de encararmos os programas das diversas áreas se torna diferente de acordo com o nosso objetivo. Por exemplo, a planta baixa de uma casa pode ser desenhada a partir de suas medidas, sem a necessidade de uma fotografia aérea da casa ou, até mesmo, da existência da casa. Por outro lado, para analisarmos uma amostra de bactérias no microscópio precisamos da imagem da amostra, de onde podemos obter alguma informação, sem a necessidade de conhecermos a posição exata de cada bactéria. Esta diferença de objetivos vai levar à modelos de trabalho diferentes. Em processamento de Imagens usa-se o modelo de matricial e a computação gráfica geralmente se baseia no modelo de objetos vetoriais. Neste modelo os objetos são armazenados apenas a partir da descrição das coordenadas de seus vértices, sejam elas espaciais ou planares (três ou duas dimensões, respectivamente). Dessa maneira utiliza-se um sistema de coordenadas Cartesiano, onde os objetos podem ser escalados, rotacionados e transladados com maior liberdade para cada objeto. O modelo matricial utiliza uma matriz de dados para armazenar a informação de cor em cada ponto da imagem, onde o sistema de coordenadas é obviamente uma grade de números inteiros que descrevem a posição na matriz. Portanto, no modelo matricial não há distinção dos objetos contidos na imagem. Além disso, armazenar a matriz que contém a imagem geralmente exige muito mais memória que armazenar a descrição vetorial.

A diferença de modelos fica explícita quando apresentamos o paradigma dos 4 universos, que nos ajudará a situarmos todos esses conceitos.

Cor no Paradigma dos 4 Universos:

Uma vez que sabemos amostrar e reconstruir cor, podemos finalmente situar cor no paradigma dos 4 universos. Cor é uma onda eletromagnética que matematicamente pode ser representada por uma função unidimensional, mas que usamos um número finito, pequeno e discreto de sensores como no olho humano. Cada conjunto de sensores é chamado de modelo de representação, e cada sensor no modelo é chamado de componente.

Quando codificamos cor é muito comum usarmos 1 byte para cada componente. Um byte permite 2 8 = 256 possibilidades, assumindo valores de 0 a 255. Por isso esses números aparecem tanto em programas de processamento de imagens e não sabíamos de onde vinham. Mas, repare que essa é apenas uma possível representação, por ser a mais comum induz a algumas pessoas pensarem que é a única, e pior, algumas pessoas pensam que cor no computador se resume aos tais valores de 0 a 255.

2 Tópicos de processamento de imagens:

Uma vez tendo nos situado no contexto de Processamento de Imagens podemos agora desdobrar essa área nos tópicos que serão abordados. O ponto central de discussão será, é claro, a Imagem Digital. Falaremos sobre dois aspectos importantes que definem a imagem: Resolução e Cor. Feito isso, podemos atacar os pontos de Captura (entrada) e Visualização (saída), Armazenamento e por fim Processamento. Esses outros pontos tem por objetivo esclarecer algumas confusões na área e preparar o aluno para cursos mais avançados.

A figura a seguir ilustra a relação entre os diversos tópicos.

Contínuo x Discreto:

Para podermos introduzir o conceito de imagem digital é necessário antes falarmos sobre funções contínuas e funções discretas. Podemos pensar em uma função contínua como um corda sem emendas que se estende indefinidamente (ou seja infinita) e por mais que você corte essa corda, sempre poderá cortá-la um pouco menor indefinidamente (ou seja infinitesimal). Matematicamente estamos falando de uma função real definida na reta toda (em ), onde para cada valor de x fornecido sempre existe um único valor de f(x) obtido.

Formalmente:

O computador só é capaz de armazenar bits, um valor que pode ser 0 ou 1. Para simplificar as coisas juntou-se 8 bits formando uma palavra chamada de byte. Um byte então pode assumir 28 = 256 valores diferentes, variando de 0 a 255. Quando falamos de sistemas operacionais de 16 bits e 32 bits, estamos falando da maior palavra que aquele sistema pode processar de uma vez, por isso sistemas de 32 bits são mais eficientes que os de 16. Assim, o computador trabalha sempre com números inteiros ou na melhor das hipóteses com uma aproximação de um número real, chamada de ponto flutuante (isso porque o número de bits dedicado para as casas decimais é flexível de acordo com o número). Por conseqüência, não é possível representar uma função contínua no computador. Podemos apenas simula-la.

O processo para trazer uma função contínua para o computador é discretizando-a (ou digitalizando-a), ou melhor, tomando valores pontuais ao longo de x e guardando o valor de f(x) correspondente (é claro que o eixo f(x) também é contínuo, assim também precisaremos discretizalo). O processo de discretização do eixo x (o domínio) é chamado de Amostragem, o do eixo f(x) (o contradomínio) é chamado de Quantização. Em resumo, a discretização de qualquer sinal contínuo primeiro passa por uma amostragem e depois passa por uma quantização. Além disso, não podemos armazenar um sinal que se estenda indefinidamente, portanto o sinal digital também é limitado a um intervalo do domínio. A amostragem que vemos na figura é a mais comum de todas e mais popular, implementada na grande maioria de dispositivos de captura. É chamada de uniformemente espaçada, pois cada amostra é tomada em intervalos iguais. Embora existam também técnicas de amostragem que utilizam menos amostras onde a função é monótona e mais amostras onde a função apresenta mais irregularidades.

A quantização mais comum consiste em tomar o valor máximo e o valor mínimo da função, e dividir este segmento em intervalos iguais de acordo com o número de bits definido para armazenar uma amostra. Assim, o número de valores possíveis será 2.

Os problemas aparecem quando tentamos reconstruir a função contínua a partir da função discretizada. Por volta de 1920, Nyquist mostrou que existe um limite para que amostragem seja bem sucedida e não introduza erros. Baseados nesse limite, Shannon e Whittaker escreveram o teorema que diz que existe uma reconstrução exata de uma função amostrada uniformemente com uma determinada taxa de amostragem ( t 1 ), se esta taxa for maior que o dobro da maior variação contida na função ( 2 ).

Neste caso, a reconstrução ideal é dada por:

Assim, uma técnica muito comum é aplicar uma transformação na função para que contenha apenas freqüências dentro da taxa de amostragem desejada, na prática um filtro de suavização.

O Paradigma dos Quatro Universos:

Esse paradigma vai nos ajudar a entender esse processo de sair do mundo real, onde os sinais são contínuos, e ir para o mundo do computador onde tudo é discreto. O paradigma especifica 4 universos. O universo Físico, onde estão os objetos do mundo real. O universo Matemático, onde formulamos descrições abstratas desses objetos. O universo de Representação vai permitir trazer essas descrições abstratas para o mundo digital, e é onde se dará a discretização dos sinais contínuos. O universos de Implementação é onde é feita a codificação do sinal discretizado na memória do computador através de uma estrutura de dados. Assim, para estudar um determinado fenômeno, ou objeto da natureza, no computador, nós precisamos associá-lo a um modelo matemático e então encontrar uma representação discreta para esse modelo que pode ser implementada no computador. A codificação dos dados pode ser decodificada e depois reconstruída para podermos voltar com o fenômeno estudado para o mundo real.

A imagem fotográfica é obtida do mundo real através de câmeras ou sensores que captam luz. A imagem capturada em um filme fotográfico representa bem a imagem real que queremos transportar para o computador. Repare que o filme define um plano limitado por um retângulo, onde cada posição nesse plano contém a informação de cor relativa aquela posição, ou seja, a imagem neste caso é um sinal de cor 2D contínuo, onde o domínio é o plano e o contradomínio é o espaço de cor. A discretização disso é muito simples, segue os mesmos princípios da discretização de sinais 2D contínuos quaisquer.

A imagem digital é obtida a partir de uma amostragem e de uma quantização dessa função, como já foi visto, e pode ser representada pela mesma função, só que neste caso, x e y são números inteiros. Uma vez amostrado o plano temos uma matriz de valores que representam a cor. Cada elemento dessa matriz é chamado de Pixel (abreviação de Picture Element). Mas, ainda não falamos nada sobre a quantização da cor. Na realidade cor também é um fenômeno físico para o qual precisamos fazer os mesmos passo que fizemos para o plano da imagem. Precisamos descobrir a definição de cor, suas representações e como trazê-las para o computador. Por enquanto, vamos deixar essas discussões de lado e atacar a questão de amostragem do plano 2D onde as cores estão distribuídas.

A figura a seguir ilustra o processo de discretização da imagem e mostra uma possível codificação da cor para cada elemento da matriz.

3 Resolução espacial:

Ao ser digitalizada a imagem assume um tamanho adimensional, em pixels. Mas, pode-se conhecer uma medida de qualidade da amostragem, conhecendo-se a razão entre o número de pixels obtido e o tamanho da imagem real no filme ou equivalente. A isso chama-se de Resolução. Em geral, é medida em pontos por polegada ou DPI (dots per inch), mas pode ser também em pontos por centímetro ou DPC, ou ainda em qualquer outra unidade equivalente. Também é simples estabelecer a relação: número de pixels = resolução x tamanho real. Para entender melhor isso, pode-se fazer a seguinte questão: Dado o tamanho da imagem (em cm, in, etc...), quantos valores discretos vão ser tomados? Escolhendo-se a resolução a resposta é dada pela equação acima.

Veja algumas resoluções típicas: Monitor Comum - 72 DPI; Scanner - 1200 DPI; Impressora Jato de Tinta Popular - 600 DPI Como temos duas dimensões, podemos definir uma resolução horizontal e uma vertical. Quando nada se diz a respeito disso, quer dizer que são iguais (a grande maioria das vezes), caso contrário são necessários dois valores. Uma vez que são diferentes, a razão de aspectos da área entre um pixel e outro não é 1:1 e portanto não é um quadrado. Isso gera algumas confusões, pois no monitor a razão é 1:1 e esta imagem quando visualizada aparecerá deformada.

Quando duas imagens com tamanhos reais iguais são capturadas com resoluções diferentes, naturalmente terão número de pixels diferentes e na tela aparecerão com tamanhos diferentes. Na figura a seguir mostramos um círculo amostrado em duas resoluções, mas exibido no seu tamanho original. 

Quando duas imagens de tamanhos reais diferentes são capturadas com resoluções diferentes de tal forma que gerem imagens digitais com o mesmo número de pixels, quando visualizadas no monitor aparecerão com o mesmo tamanho na tela. No exemplo a seguir mostramos as imagens proporcionais ao seu tamanho original.

Quando queremos realizar alguma medida sobre os objetos contidos na imagem surge um outro parâmetro, a escala. Pode-se defini-la matematicamente idêntica a resolução só que as unidades serão as mais variadas possíveis. Caso não seja conhecida, é fácil de se obtê-la. Mede-se algumas distâncias reais na imagem digital e calcula-se a média das razões entre distância e número de pixels, obtendo-se a escala. A partir desse momento outras distâncias podem ser feitas na imagem com qualidade aceitável. É claro que se os objetos não estejam em um mesmo plano, as medidas são muito mais complexas e envolvem transformações projetivas.

Topologia de um Pixel:

As amostras do plano são pontuais e adimensionais, mas os dispositivos para reconstrução não deixam um espaço entre uma amostra e outra. Assim, muitas vezes iremos representar o pixel, não como um ponto, mas como um quadrado preenchido com a cor do pixel, que está no seu centro. Por sinal, o exemplo anterior já usa essa representação. Como vimos, pixels são normalmente quadrados, gerando uma grade (grid) regular devido à amostragem uniformemente espaçada. Um problema que aparece nesse momento é: Quais são os vizinhos de um determinado pixel? Essa pergunta é fundamental para algoritmos de preenchimento de áreas e algoritmos de determinação de continuidade de objetos na imagem. Nesta grade regular podemos definir dois tipos de vizinhança: 4 conectada (onde os vizinhos são eqüidistantes) ou 8 conectada (onde nem todos são eqüidistantes, os vizinhos na diagonal são mais distantes que os vizinhos nas laterais). Normalmente usa-se uma combinação das duas vizinhanças, definindo 4 conectada para os objetos e 8 conectada para o fundo.

Para criar uma vizinhança onde todos os vizinhos fossem eqüidistantes e só houvesse uma definição, temos que mudar a grade regular para uma grade hexagonal. São poucos algoritmos implementados com essa vizinhança, pois como a imagem está em geral amostrada em uma grade regular, deve-se converte-la para a grade hexagonal, realizar o processamento e converte-la de volta para a grade regular.

Já que estamos falando da grade não poderíamos deixar de falar sobre a origem do sistema de coordenadas. Localizada no canto superior esquerdo na grande maioria dos sistemas de processamento de imagem, pode na realidade ser posicionada em qualquer lugar da imagem, até mesmo fora dela.

Essa localização preferencial para o canto superior esquerdo, com eixo y invertido em relação ao padrão da matemática, é herdada dos próprios dispositivos de visualização, onde a primeira linha a ser redesenhada na tela é a do topo da tela, que segue o padrão de escrita ocidental, da esquerda para a direita e de cima para baixo.

Reconstrução:

Quando falamos em amostragem imediatamente nós temos o problema inverso: Como reconstruir? Ou melhor podemos fazer a pergunta: Dados os valores discretos, qual a função contínua que passa por eles? Quando estamos no ambiente computacional, também estamos querendo resolver um outro problema que é o de re-amostragem. Isto é, reconstruir e amostrar novamente com outra resolução ou com outra grade regular ou não. Em matemática, reconstrução é sinônimo de interpolação. O uso de interpolação permite que dada uma seqüência de amostras possamos obter o valor da função em uma posição qualquer do eixo. A técnica mais trivial é simplesmente escolher a amostra mais próxima da posição desejada e tomar o seu valor como valor desta posição. Esta técnica é usada muito para a visualização da imagem em maior ou menor proximidade, ou melhor, fazendo Zoom, simulando uma aproximação ou afastamento da imagem em relação ao observador. Uma outra técnica muito utilizada para fazer reconstrução é a de interpolação linear (bilinear no caso de 2 dimensões). Essa técnica calcula uma média ponderada das amostras mais próximas da posição desejada de acordo com a distância à mesma.

Pela figura a seguir podemos perceber que a interpolação linear irá obter resultados bem melhores que a de vizinho mais próximo. Mas fica claro que podemos obter resultados ainda melhores usando curvas em vez de retas. Uma técnica com esse enfoque que se tornou popular é a interpolação bi-cúbica, que é semelhante a interpolação linear, mas em vez de usar retas, usa funções cúbicas (x³ ).

Todas as técnicas de deformação (warping) da imagem são implementados usando interpolação. Até mesmo alguns movimentos rígidos, como as rotações diferentes de 90o , utilizam interpolação, por que no fundo estamos reconstruindo, deformando o modelo contínuo e reamostrando. Isto também ocorre nas transformações contínuas de uma imagem em outra (morphing) que são feitas como uma composição de uma deformação do R 2 (warping) combinada com uma composição de cores (blending).

Aliasing:

Um fenômeno muito comum em amostragem é o fenômeno de aliasing. Ele acontece quando realizamos uma amostragem muito pobre da função contínua original e quando vamos reconstrui-la obtemos resultados inconsistentes com o esperado. Matematicamente podemos dizer que a freqüência de amostragem foi aproximadamente inferior à maior freqüência de variação da função contínua

Para resolver o problema de aliasing temos duas soluções, aumentar a taxa de amostragem, que em geral nem sempre é possível, ou suavizar a função contínua para que ela não tenha freqüências mais altas que a nossa taxa de amostragem. A imagem a seguir mostra o efeito do aliasing espacial em uma imagem que foi amostrada em alta e baixa resolução. Traçando-se uma linha sobre a imagem podemos compreender melhor o conceito de freqüência espacial e o respectivo efeito de aliasing no resultado. Aliasing também aparece quando estamos reamostrando com menos pontos uma função já discretizada. Neste momento podemos realizar uma média ponderada dos valores que estão sendo descartados.

Podemos ver o fenômeno de aliasing em outras situações como ao filmarmos uma roda de um carro rodando mais rápido do que a câmera é capaz de capturar, neste caso vemos a roda girar para trás, justamente por que a taxa de amostragem temporal está muito baixa. Da mesma forma que o aliasing espacial, aliasing temporal ocorrerá sempre que o objeto se mover repetitivamente mais rápido que a taxa de amostragem temporal ou número de quadros por segundo. Um problema muito comum, que é uma forma de aliasing, aparece quando sobrepomos dois padrões periódicos que interagem não linearmente produzindo um terçeiro padrão. Esse novo padrão é chamado de padrão de Moiré.

Em Computação Gráfica aliasing é muito comum durante o desenho de primitivas. A memória de vídeo da placa gráfica pode ser vista como uma imagem e uma primitiva a ser desenhada como um objeto real a ser amostrado. Como as primitivas possuem bordas abruptas (alta freqüência) aliasing aparece naturalmente. A solução é suavisar as bordas durante o desenho da primitiva.

Também podemos evitar aliasing no processamento de cenas sintéticas que faz uso do algoritmos de tracado de raios (ray tracing). Neste caso para cada pixel da imagem a ser gerada, criamos vários sub-pixels, ou super-amostramos a cena, para depois calcularmos uma média desses valores que será por fim atribuída ao pixel.

Quando falamos de cor de um ponto de vista físico, na realidade estamos falando de Luz. A luz percorre o espaço, ora se comportando como uma onda, ora como uma partícula, isso caracteriza a natureza dual da luz. Para estudarmos cor iremos observar o comportamento da luz como uma onda. Podemos dizer que neste caso a luz é uma radiação eletromagnética que possui uma certa “energia” para cada comprimento de onda. A função que informa o valor dessa “energia” é chamada de Distribuição Espectral de Potência.

Na figura acima podemos ver um exemplo de distribuição, e a diferença entre uma cor monocromática ideal (apenas 1 comprimento de onda) e uma cor monocromática real (onde existe um comprimento de onda predominante, mas não é único).