COMANDOS BÁSICOS VOLTADOS AO PROCESSAMENTO DE IMAGENS EM MATLAB Processamento Digital de Imagens CURSO TÉCNICO EM GEOPROCESSAMENTO Prof. Daniel C. Zanotta 2015/1 1 1 INTRODUÇÃO O MATLAB foi desenvolvido no início da década de 80 por Cleve Moler, no Departamento de Ciência da Computação da Universidade do Novo México, EUA. É um software interativo de alta performance voltado para o cálculo numérico. Integra análise numérica, cálculo com matrizes, processamento de sinais e construção de gráficos em ambiente de fácil uso, onde problemas e soluções são expressos intuitivamente como eles são escritos matematicamente, ao contrário da programação tradicional (C, C++, Java). O MATLAB pode ser entendido como um código de programação interpretado, uma vez que sempre é traduzido para linguagem de máquina quando executado. Essa característica pode ser vista como uma comodidade, uma vez que torna sintaxe e comandos mais intuitivos, mas também como uma desvantagem a medida que o código interpretado é computacionalmente mais lento. Figura 1.1. MATLAB R2012a. O MATLAB caracteriza-se também por ser um sistema cujo elemento básico de informação é uma matriz, daí surge seu nome MATrix LABoratory (Laboratório de Matrizes). Esse sistema de organização permite a resolução de muitos problemas numéricos em apenas uma fração do tempo que se gastaria para escrever um programa semelhante em linguagem Fortran, Basic ou C. A estrutura do MATLAB está toda organizada para manipular matrizes1, tornando todas as operações matriciais mais eficientes computacionalmente. Além disso, essa estrutura matricial dos dados é extremamente conveniente para tratamento e processamento de dados bidimensionais, ou espaciais, como imagens. 1 Isso não impossibilita que o usuário também possa fazer procedimentos matemáticos simples ou vetoriais. 2 1.1 Inicialização do MATLAB Figura 1.2 Tela de inicialização do MATLAB R2012a. Quando o MATLAB é carregado, algumas janelas básicas são exibidas: a Janela de Comando (Command Window), o Espaço de Trabalho (WorkSpace) que é onde ficam as variáveis, a pasta de trabalho atual (Current Folder), e o Histórico de Comandos (Command History). A Janela de Comando é ativada quando se inicializa o MATLAB, e o "prompt" padrão (>>) é exibido na tela2. 1.2 Comandos A partir desse ponto, o MATLAB espera as instruções do usuário. Para inserir uma matriz pequena, por exemplo, pode-se digitar: >> A = [1 2 3; 4 5 6; 7 8 9] colocando-se colchetes em volta dos números e separando as linhas por ponto e vírgula. Quando se pressiona a tecla <Enter> o MATLAB responde com: 2 O software está pronto para receber comandos quando no canto inferior esquerdo aparece a mensagem “Ready”. Quando ele está inicializando ou executando algum comando aparece “busy” e o usuário deve aguardar. 3 A variável “A” aparece no workspace. É importante ressaltear que todas as variáveis (imagens, por exemplo) a serem futuramente trabalhadas devem constar no workspace. Para fazer uma operação aritmética simples, o usuário pode teclar: >> soma = 5 + 2 soma = 7 A variável “soma” aparece no workspace para uso futuro. Se o usuário acrescentar o terminador ponto-e-vírgula ( ; ), o cálculo será executado e a variável é criada/alterada no workspace, porém, o resultado não será mostrado na tela. Isso evita que a tela fique cheia de resultados calculados previamente3. Esse procedimento é especialmente usado em arquivos com extensão ".m" e em situações onde o resultado é uma matriz de grandes dimensões, como imagens. O sinal de percentagem (%), indica comentários, e não é lido como parte do comando. >> soma = 6 + 5 % somatório de dois valores inteiros. As teclas com setas ↑ podem ser usadas para encontrar comandos digitados anteriormente, para execução novamente ou sua reedição. Por exemplo, suponha que seja necessário calcular uma raiz quadrada com a função sqrt: >> sqt(tan(pi/5)) Como o comando foi digitado incorretamente, o MATLAB responde com uma mensagem de erro: ??? Undefined funcion or variable sqt. Ao invés de repetir novamente a digitação da linha inteira, simplesmente pressiona-se a tecla ↑. O comando anterior retorna, podendo-se inserir a letra "r" com maior facilidade. >>sqrt(tan(pi/5)) ans = 0.8524 1.3 Declaração de Variáveis Como mencionado anteriormente, o MATLAB é uma linguagem interpretada. As expressões usadas são traduzidas pelo sistema e transformadas em linguagem de máquina. As declarações no MATLAB são frequentemente da forma: >> variável = expressão 3 Imagine quando um procedimento realizado com uma imagem de milhões de pixels é executado sem ponto-evírgula? Todos os pixel serão mostrados na tela dificultando a visualização. 4 ou simplesmente >> expressão A avaliação das expressões produzem matrizes, que são então mostradas na tela e atribuídas às variáveis para uso futuro. Se o nome da variável e o sinal de igualdade "=" são omitidos, a variável com o nome ans, que representa a palavra "answer" (resposta), é automaticamente criada. Por exemplo, digite a expressão: >> 1900 / 81 que produz: Ans = 23.4568 Ou alternativamente: >> V = 1900 / 81 que produz: V = 23.4568 É importante observar que se outro comando for dado sem atribuição inicial a nenhuma variável, o valor antigo de “ans” será substituído pelo novo. Se a expressão é tão grande que não cabe em apenas uma linha, pode-se continuar a expressão na próxima linha usando um espaço em branco e reticencias, ( ... ), ao final das linhas incompletas. Por exemplo: >> S = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 - 1/10 + 1/11 - 1/12 + 1/3 - 1/4 . . . >> - 1/8 + 1/9 - 1/10 + 1/11 - 1/12 + 1/13; calcula o resultado da série, atribuindo o somatório à variável “S”, mas não imprime o resultado na tela, isto porque adicionou-se um ‘ ; ‘ ao final da expressão. Note que os espaços em branco entre os sinais ‘=’, ‘+’ e "-" são opcionais, mas o espaço em branco entre "1/4" e "..." é obrigatório. As variáveis e funções podem ser formadas por um conjunto de letras, ou por um conjunto de letras e números, onde somente os primeiros 19 caracteres do conjunto são identificados. O MATLAB é case-sensitive, isto é, faz distinção entre letras maiúsculas e minúsculas, assim a e A não são as mesmas variáveis. Todas as funções devem ser escritas em letras minúsculas: inv(A) calcula a inversa de A, enquanto INV(A) é uma função indefinida, não existe. Execute algumas expressões como: >> A = 5 + 2 >> B = A + 3 >> C = A + B; >> D = B / C >> P = (10*A) – (2 / C)*3 Note que todas as novas variáveis criadas vão sendo automaticamente salvas no workspace. Experimente também criar algumas matrizes: M = [ 1 2 3; 4 5 6; 7 8 9] 5 N = [ 1 1 1; 2 2 2; 3 3 3] 1.4 Números e Expressões Aritméticas A notação decimal convencional com ponto decimal opcional e o sinal de menos é usada para números (observe que um números com virgulas, assim como nas calculadoras, são representados com ponto). A potência de dez pode ser incluída como um sufixo. A seguir são mostrados alguns exemplos de números aceitos: 3 -99 0.00001 9.6374586 1.602E-20 6.06375e23 As expressões podem ser construídas usando-se os operadores aritméticos básicos e as regras de precedência: 1 ^ Exponenciação 2 sqrt() Raiz quadrada 3 / Divisão a direita 4 \ Divisão a esquerda 5 * Multiplicação 6 + Adição 7 - Subtração Deve-se notar que existem dois símbolos para divisão: as expressões 1/4 e 4\1 possuem o mesmo valor numérico, isto é, 0,25. Parênteses são usados em sua forma padrão para delimitar a atuação dos operadores aritméticos. Não existem colchetes e chaves, apenas parênteses em diversos níveis. 2 FUNÇÕES O MATLAB possui um conjunto extenso de funções incluídas nas mais diversas bibliotecas internas (MATLAB TOOLBOX), que são na realidade arquivos com a extensão 6 ‘.m’ criados a partir das funções intrínsecas4. A biblioteca externa pode ser constantemente atualizada à medida que novas aplicações são desenvolvidas por você. As categorias gerais de funções matemáticas disponíveis no MATLAB incluem: matemática elementar; matemática avançada; matrizes elementares; matrizes especiais; decomposição e fatoração de matrizes; polinômios; solução de equações diferenciais; equações não-lineares e otimização; derivação e integração numérica; análise de dados; análise estatística; ferramentas para mapas processamento de sinais; processamento de imagens. 2.1 Arquivos ‘.m’ (ambiente de programação) Os comandos do MATLAB são normalmente digitados na Comand Window, onde uma única linha de comando é introduzida e processada imediatamente. O MATLAB é também capaz de executar sequências de comandos armazenadas em arquivos. Os arquivos que contêm as declarações do MATLAB são chamadas arquivos ‘.m’, e consistem de uma sequências de comandos normais do MATLAB, possibilitando incluir outros arquivos ‘.m’ escritos no formato texto (ASCII). Na Janela de Comando do MATLAB selecione New M-File para criar um novo arquivo ou Open M-File para editar um arquivo já existente, a partir do menu File. Os arquivos podem também ser editados fora do MATLAB utilizando qualquer editor de texto (como o bloco de notas). Vale notar que ao se editar o arquivo ‘.m’ no editor padrão do Matlab, o usuário contará com uma série de codificações em forma de cores que auxiliarão a diferenciar funções, variáveis e operadores lógicos. 2.2 Toolbox de Processamento de Imagens A toolbox de processamento de imagens do MATLAB conta com os mais variados procedimentos aplicados no processamento digital de imagens para as mais diversas 4 Estas funções são criadas por desenvolvedores profissionais e atualizadas a cada nova versão do MATLAB. 7 aplicações. Um dos principais motivos da utilização do MATLAB por diversos segmentos da ciência e do mercado de trabalho voltado à utilização de imagens é a qualidade e utilidade do toolbox de processamento de imagens. Seguem abaixo alguns exemplos de comandos básicos desta toolbox: imread = (‘filename’, ‘fmt’) lê uma imagem do arquivo especificado pelo nome do arquivo string. Se o arquivo não está na pasta atual (aquela cujo caminho foi apontado em current folder), ou em uma pasta no caminho MATLAB, especificar o caminho completo ((‘C:/Arquivos/.../filename’, ‘fmt’)). É possível também abrir uma imagem simplesmente arrastando o arquivo para dentro do workspace com maior facilidade. O fmt especifica o formato do arquivo, sua extensão de arquivo padrão. Por exemplo, especifique 'gif' para arquivos de formato Graphics Interchange. Existe uma lista de formatos suportados, com suas extensões de arquivo, digite imformats para conhecer. O valor de retorno A é uma matriz que contém os dados de imagem importada para o workspace do MATLAB. Se o arquivo contém uma imagem em tons de cinza, A é uma matriz M-por-N, onde M é o número de linhas e N o número de colunas da imagem. Se o arquivo contém uma imagem truecolor (com cores vermelho, verde e azul5), A é uma matriz M-por-Npor-3. Se o arquivo for uma imagem de satélite, por exemplo, que possui mais de 3 camadas, A é uma matriz M-por-N-por-K, sendo K o número de camadas. imshow (I) exibe a imagem. imshow (I) exibe a imagem em tons de cinza6 I imshow (RGB (:,:,ki:kf) exibe uma imagem em cor verdadeira RGB. Os dois primeiros “ : ” indicam que todas as linha e todas as colunas da imagem, respectivamente, serão mostradas. Ki indica a banda inicial e kf indica a banda final. É importante lembrar que, mesmo que as imagens contenham mais de 3 bandas (o que é muito comum), os programas conseguem mostrar em tela apenas composições coloridas de 3 dessas bandas. imwrite (A, ‘nome de arquivo’, ‘fmt’) escreve a imagem A para o arquivo especificado pelo nome do arquivo no formato especificado pelo fmt. A pode ser uma matriz M-por-N (escala de cinza da imagem) ou M-por-N-por-3 (imagem em cor verdadeira), mas não pode ser uma matriz vazia. Para arquivos TIFF, A pode ser uma matriz M-por-N-por-K, onde K é o número de bandas da imagem. nome do arquivo é uma string que especifica o nome do arquivo de saída. fmt pode ser qualquer uma das cadeias de texto listados na tabela de tipos de imagens suportados. 3 CLASSES DE DADOS Assim que a imagem é aberta no workspace do MATLAB, é possível verificar a classe dos dados do arquivo. Pixels são geralmente representadas por números inteiros e positivos, ou 5 6 (RED, GREEN e BLUE). Também chamada de Níveis de Cinza ou Monocromática. 8 seja, 1, 2, 3, 4, 5, e assim por diante. Essa formatação dos dados confere um tamanho menor ao arquivo que contém a imagem. Por exemplo, se a imagem tem 8 bits, significa que 28 = 256 e ela poderá assumir apenas 256 níveis diferentes de coloração (de 0 até 255)7, ou níveis de cinza entre o branco puro e o preto puro. Imagens de Sensoriamento Remoto usualmente possuem 8 bits. Se a imagem possuir 16 ou 24 bits, seus níveis de cinza conterão 216 = 65536 e 224 = 167772168, respectivamente. Obviamente a imagem contará com um detalhamento maior, mas o tamanho computacional de cada pixel aumentará de acordo o seu valor em bits. Esse valor (8, 16, 24) é conhecido como a resolução radiométrica da imagem. O MATLAB representa essa estruturação de dados por uint8 (Inteiros 8 bits) ou uint16 (Inteiros 16 bits), por exemplo. Quanto maior o número de bits, maior é a quantidade de níveis de cinza e melhor é a resolução: Figura 3.1 Correspondência entre número de bits e qualidade da imagem. Fonte: CEPSRM-UFRGS. Para a manipulação da imagem através de operações matemáticas, é preciso “quebrar” essa formatação padrão para permitir que os cálculos possam ser feitos (ex: valor do pixel 53/2 = 26,5). Uma classe de dados que pode assumir valores fracionários é a classe double. A classe double pode assumir qualquer valor Real entre menos infinito e mais infinito. Em 7 8 Onde 0 representa o preto e 255 representa o branco. Nesse caso, 0 representa o preto e 16777216 representa o branco. 9 processamento de imagens é muito comum trabalhar com os dados na classe double, uma vez que esta classe permite a manipulação completa dos dados sem restrições. Portanto, essa é a classe de dados que devemos trabalhar em PDI9. A figura abaixo mostra a origem dessas classes dentro do conjunto matemático dos números: Figura 3.4 Exemplificação de onde se encontram os valores das imagens no conjunto matemático dos números Comandos comumente utilizados para transferência entre classes de dados no MATLAB: double (x) : Converte os dados (x) de qualquer classe para a classe double, números fracionários positivos ou negativos. uint8(x): Converte os dados (x) de qualquer classe para a classe uint8, inteiros positivos de 0 a 255. uint16 (x): Converte os dados (x) de qualquer classe para a classe uint16, inteiros positivos de 0 a 65536 Ao mesmo tempo que é importante trabalhar com as imagens no formato double dentro do MATLAB, é necessário converter a mesma para uint8 ao final dos processos antes de gravar. Assim, outros softwares poderão ler a imagem processada sem maiores problemas. Muito importante: Ao visualizar alguma imagem na tela, a função imshow(img) pode variar dependendo do tipo de classe da imagem. Por exemplo, para o MATLAB, se a imagem estiver na classe uint8, entende-se que ela possui valores variando de 0 até 255, e a função imshow desta imagem mostrará o valor 0 como preto e o valor 255 como branco. Os demais valores intermediários receberão diferentes níveis de cinza de acordo com o seu valor. Se por acaso a imagem possuir a classe double, a função imshow mostrará o valor 0 como preto, e o valor 1 como branco. Os demais valores fracionários entre 0 e 1 receberão diferentes níveis de cinza. 9 Acostume-se a sempre que abrir a imagem no workspace transformar ela para class double. 10 Qualquer pixel com valor menor que 0 ficará preto, assim como qualquer pixel com valor maior que 1 ficará branco. Assim, ao converter uma imagem de uint8 para double, deve-se tomar o cuidado de dividir seus valores por 255 (valor máximo da classe uint8). Dessa forma, todos os valores da imagem ficarão entre 0 e 1, e quando a imagem for apresentada na tela por imshow apresentará os valores corretos de níveis de cinza. Caso essa divisão por 255 não seja feita, pixels com valores maiores que 1 ficarão brancos (ou seja, muitos pixels na imagem). IMPORTANTE: Se "A" for uma imagem de intensidade de cinzas ou uma imagem colorida (RGB) de classe <uint8>, imwrite grava os valores reais da matriz no arquivo. Se "A" for da classe <double>, imwrite redimensiona os valores da matriz antes de gravá-los, usando uint8(round(255*A)). Esta operação converte os números de ponto-flutuante na faixa [0,1] em inteiros de 8 bits na faixa [0,255]. Sugere-se a seguinte sequencia de comandos para a abertura e salvamento de imagens: Abrir: 1) Arrastar a imagem para o worspace; 2) Passar para a classe double >> img = double (img); 3) Se quiser mostrar em tela, dividir por 255 (máximo valor) >> imshow = img(: , : , [R G B]) / 255); 10 4) Processar a imagem Salvar: 1) Converter a imagem para uint8 >> img = uint8 (img); 2) Salvar com a função imwrite, imsave ou geotiffwrite; 4 REPRESENTAÇÃO DE IMAGENS DIGITAIS O termo imagem refere-se à função bidimensional de intensidade da luz f(x,y), onde x e y denotam as coordenadas espaciais e o valor f em qualquer ponto (x, y) é proporcional ao brilho (ou níveis de cinza) da imagem naquele ponto. Uma imagem digital é uma imagem f(x, y), duas dimensões, discretizada11 tanto em coordenadas espaciais quanto em brilho. Uma imagem digital pode ser considerada como sendo uma matriz cujos índices de linhas e de colunas identificam um único ponto na imagem, e o correspondente valor do elemento da matriz identifica o nível de cinza naquele ponto. A Convenção dos eixos para representação de imagens digitais no Processamento de Imagens é diferente da convenção usada na Computação Gráfica. 10 11 Se for imagem 8 bits 28 = 256. Onde usam-se penas valores inteiros. 11 Figura 4.1 Convenção dos eixos para representação de imagens digitais Os elementos dessa matriz digital são chamados de elementos da imagem, elementos da figura, "pixels" , abreviação de "picture elements" (elementos da figura). Quanto mais pixels uma imagem tiver, melhor é a sua resolução e qualidade. A imagem abaixo mostra como uma imagem em níveis de cinza é representada através de uma matriz composta por números inteiros, cada um com um certo valor correspondente a um nível de cinza. 12 Figura 4.2 (a) imagem digital com grupo de pixels selecionados; (b) zoom da janela de 9x9 pixels; (c) valor dos contadores digitais da função f(x, y). Fonte: CEPSRM-UFRGS. 4.1 Histograma da Imagem Numa imagem, a informação da quantidade de vezes que uma determinada cor se repete representa o histograma dessa imagem. Como as imagens são formadas por diversas matrizes sobrepostas, o histograma é gerado banda por banda separadamente. Uma informação assim sobre a imagem é importante, pois pode gerar parâmetros para a avaliação da qualidade da mesma, como nitidez, luminosidade e profundidade. A função imhist exibe o histograma da imagem. >> imhist (I) exibe um histograma de 256 tons de cinza para a imagem. Uma barra de calibragem de tons de cinza é sempre exibida abaixo do traçado. >> imhist (I , N) exibe o histograma usando N posições ao invés de 256. 13 Figura 4.3 Exemplo de Histograma de Imagem. 4.2 Imagens Coloridas As imagens obtidas por sensores eletrônicos, em diferentes canais, são formadas por níveis de cinza (imagens monocromáticas). A quantidade de energia refletida pelos objetos vai determinar a intensidade dos níveis de cinza entre o branco (quando refletem toda a energia) e o preto (quando absorvem toda a energia). Ao combinar as imagens monocromáticas produzidas por cada banda através das cores azul, verde e vermelho (cores primárias), é possível gerar imagens ou composições coloridas. Nas imagens coloridas, a cor de um objeto vai depender da quantidade de energia por ele refletida nas faixas espectrais de cada uma das bandas selecionadas para visualização. Figura 4.4 Imagem colorida, obtida a partir das imagens ETM+ LANDSAT-7, dos canais 1, 2 e 3, com as cores azul, verde e vermelho. Fonte: FLORENZANO (2002) 14 Figura 4.5 Imagem colorida, obtida a partir das imagens ETM+ LANDSAT-7, dos canais 3, 4 e 5, com as cores azul, verde e vermelho. Fonte: FLORENZANO (2002) 5 PASSOS FUNDAMENTAIS DO PROCESSAMENTO DE IMAGENS A área de processamento de imagens é um excelente exemplo de interdisciplinaridade. As diversas técnicas originalmente desenvolvidas para tratamento de sinais unidimensionais foram, em primeiro lugar, adaptadas para tratamento de imagens obtidas de satélites e de naves espaciais. Posteriormente, com o rápido avanço das opções de hardware e software, estas mesmas técnicas passaram a ser aplicadas em inúmeros domínios tais como fotografia, medicina, ciência dos materiais, microscopia, artes, etc... O primeiro passo no processo é a aquisição da imagem, isto é, adquirir uma imagem digital. Para fazer isso, necessitamos de um sensor para imageamento e a capacidade de digitalizar o sinal produzido pelo sensor. O sensor poderia ser uma câmera fotográfica que adquire fotografias de áreas inteiras de uma só vez. O sensor de imageamento poderia também ser uma câmera de varredura por linha que produza uma única linha de imagem por vez, como no caso dos Satélites de Sensoriamento Remoto. Vale lembrar que se a saída da câmera ou outro sensor de imageamento não se encontrar na forma digital, um conversor analógicodigital realiza a digitalização, um Scanner, por exemplo. A natureza do sensor e da imagem que ele produz são determinadas pela aplicação. As imagens digitais tomadas por sensores remotos podem ser adquiridas por provedores na internet. São exemplos desses provedores a Divisão de Geração de Imagens do Instituto Nacional de Pesquisas Espaciais (DGI-INPE), acessível em www.dgi.inpe.br através de um pequeno cadastro, ou United States Geological Survey USGS – NASA em www.usgs.gov . Após a obtenção de uma imagem digital, o próximo passo trata de pré-processar a imagem. A função chave no pré-processamento é melhorar a imagem de forma a aumentar as chances para o sucesso dos processos que serão aplicados na etapa de processamento. Nesse 15 exemplo, o pré-processamento tipicamente envolve técnicas para calibração radiométrica, remoção de ruídos, correção atmosférica e seleção da região a ser estudada. O processamento, realizado após o pré-processamento, visa à extração de informações úteis para uma determinada aplicação. São exemplos disso aplicações urbanas, florestais, cultivo agrícola, desastres naturais, detecção de mudanças, mapeamento de diversos tipos em diversas escalas e estudos meteorológicos. A variedade desses processos será estudada uma a uma nos capítulos seguintes. 6 REFERÊNCIAS BASTOS, V.P. Técnicas de Segmentação de Imagens para Recuperação de Informações Visuais. FLORENZANO, Tereza Gallotti. Imagens de satélites para estudos ambientais. São Paulo: Oficina de Textos, 2002. CROSTA, Álvaro Penteado - Processamento Digital de Imagens de Sensoriamento Remoto. Ed. Rev. Campinas, SP: IG/UNICAMP, 1993. Engenharia Cartográfica – UFRGS - Página Dinâmica para Aprendizado do Sensoriamento Remoto (PDASR). 16 Histograma da Imagem O histograma de uma imagem fornece informação útil para fazer realce e análise da imagem. O histograma de uma imagem revela a distribuição dos níveis de cinza da imagem. É representado por um gráfico que dá o número de pixels na imagem para cada nível de cinza. Definição: Seja uma imagem digital g de M linhas e N colunas. O histograma da imagem g, Hg, pode, analiticamente, ser definido por : onde nk é o número de vezes que o nível de cinza K aparece na imagem. Pode-se utilizar o MATLAB para gerar o Histograma de uma imagem. Primeiro a imagem deve ser lida com o comando "imread" » a =imread('baronesa.jpg'); 17 O resultado e mostrado na FIGURA 03 (Museu da Baronesa - Pelotas/RS). FIGURA 03 - Imagem lida no MATLAB Depois, gera-se o histograma como o comando "imhist" » imhist(a); O resultado é mostrado na FIGURA 04. FIGURA 04 - Histograma da Figura03 Realce O objetivo principal das técnicas de realce é processar uma imagem, de modo que o resultado seja mais apropriado para uma aplicação específica do que a imagem original [1]. As Técnicas de realce podem ser baseadas em processamento ponto-a-ponto, que modifica o nível de cinza de um pixel independentemente da natureza de seus vizinhos, ou pelo processo de filtragem, onde o novo valor depende também dos valores dos pontos vizinhos do ponto a ser processado. Contraste 18 A manipulação do contraste de uma imagem tem como objetivo melhorar a sua qualidade visual sob critérios subjetivos ao olho humano. Esse processo não aumenta a quantidade de informação contida na imagem, mas torna mais fácil a sua percepção. É normalmente utilizada como uma etapa de pré-processamento. Tipicamente, os sensores são capazes de discretizar os valores recebidos da cena em um intervalo máximo que vai de 0 até 255 (8 bits = 256 possíveis valores). Devido à má iluminação, defeitos do sensor ou mesmo às características da cena, o intervalo de valores de intensidade ocupados pelos pixels presentes em uma imagem, pode ser muito menor que esse intervalo máximo. Diz-se então que a imagem possui baixo contraste, o que torna difícil a sua visualização ou interpretação por um intérprete humano ou um sistema de processamento digital. O contraste de uma imagem pode ser avaliado observando-se o seu histograma. Uma imagem com bom contraste possui um histograma cujas barras são razoavelmente espalhadas ao longo de todo o intervalo da escala. Por exemplo, a imagem da Figura 05 (Mercado Público - Pelotas/RS) e seu histograma (Figura 06). Já o histograma mostrado na Figura 08 tem uma forma estreita que indica uma escala dinâmica pequena , isto porque corresponde a uma imagem de baixo contraste. FIGURA 05 - Imagem com contraste alto FIGURA 06- Histograma da Figura 05 FIGURA 07 - Imagem com contraste baixo FIGURA 08 - Histograma da Figura 07 Um realçamento de contraste pode ser feito mapeando as variações dentro do intervalo de tons de cinza [Vmin-Vmax] da imagem original para a variação máxima do dispositivo de 19 visualização que, geralmente, é [0, 255]. Vmin e Vmax são os valores de níveis de cinza mínimos e máximos, respectivamente, presentes na imagem original. O mapeamento é realizado através de uma função de mapeamento. Cada valor de nível de cinza na imagem original é mapeado para um novo valor de acordo com uma função de transferência, que pode ser definida como: y =f(x) onde: x é o nível de cinza original e y é o novo valor correspondente. A escolha da função f determina qual será o efeito visual obtido, e deve ser escolhida de acordo com a imagem original e o efeito desejado. Em uma transformação linear, os valores de níveis de cinza dos pixels são escalonados de tal forma que todos os pixels com valores Vmin e Vmax são mapeados para 0 e 255, respectivamente. Da mesma forma, os outros valores de níveis de cinza são mapeados para valores entre 0 e 255. Normalmente, a forma do histograma da imagem realçada é a mesma da imagem original, pois cada barra do histograma continua tendo a mesma altura, porém em uma posição diferente. No entanto, algumas vezes a função de transferência causa uma sobreposição de valores, ou seja, dois ou mais valores x são mapeados para o mesmo valor y. Quando muitos valores de intensidade na imagem original são mapeados para o valor mínimo ou máximo na imagem original diz-se que, ocorreu uma saturação (overflow) e uma perda de informação, pois os pixels que originalmente podiam ser diferenciados na imagem original agora possuem o mesmo valor de intensidade. No entanto isto pode ser um efeito desejado, por exemplo, quando as regiões escuras da imagem com pequenas variações radiométricas correspondem a áreas com o mesmo tipo de cobertura as quais não se deseja diferenciar. Um procedimento de modificação de contraste útil é o mapeamento linear por partes com a função de mapeamento caracterizada por um conjunto de pontos de quebra, que pode ser escolhido pelo usuário. Funções de mapeamento não-lineares podem ser usadas para realçar detalhes específicos na imagem. Uma função linear também utilizada é a função negativa. Ela realiza o mapeamento inverso dos níveis de cinza, revertendo a ordem do preto para o branco, de tal forma que pixels com intensidade clara serão mapeados para escuro e vice-versa. A escolha do mapeamento direto adequado é, em geral, essencialmente empírica, mas existe uma classe de métodos nos quais o mapeamento tem por finalidade produzir uma imagem cujo histograma tenha um formato desejado. Um destes métodos é a equalização de histograma. Na equalização de histograma o mapeamento tem por finalidade produzir uma imagem cujo histograma tenha um formato desejado. A equalização modifica o histograma da imagem original de tal forma que a imagem transformada tenha um histograma uniforme, ou seja, todos os níveis de cinza devem aparecer na imagem com a mesma freqüência. 20 Exemplo: Dada uma Imagem de n x m Pixels e “g” níveis de cinza. No. Ideal de pixels em cada nível => I = (n x m)/g A equalização pode ser obtida através da aplicação da formúla: Onde: g = níveis de cinza da Imagem Original q = níveis de cinza da Imagem Equalizada Figura 09) Imagem original e seu histograma[2] Figura 10) Imagem equalizada e seu histograma[2] 21 Na prática, a obtenção de um histograma perfeitamente uniforme não é possível devido à natureza das imagens digitais de sensoriamento remoto, cujos pixels podem assumir somente valores discretos. Existem técnicas para melhorar este problema, mas pode acontecer de áreas homogêneas na imagem original aparecerem "pipocadas", por que tons de cinza iguais são mapeados para níveis de cinza diferentes. O processo de equalização pode levar a falsos contornos na imagem, pois o número de níveis de cinza pode ser reduzido. A equalização pode ter um efeito de realce notável da imagem, mas o contraste pode ser muito forte e, por isto a equalização de histograma deve ser usada com muito cuidado. 22