Processamento
Digital de Imagens
Realce de Imagens
Digitais
Nesta aula abordaremos os principais
conceitos relacionados com realce de imagens digitais por
manipulação de histogramas.
Importante: O resumo abaixo deve ser complementado,
pelo aluno, com a leitura dos textos sugeridos na bibliografia do curso.
Tópicos
Introdução - Conceitos iniciais
- Objetivos do Realce de imagens
digitais
- Melhorar a qualidade visual geral de uma imagem digital,
aumentado-se o contraste entre os elementos apresentados na imagem.
- Realçar características específicas
relacionadas aos alvos imageados.
- Considerações
Gerais
- Existem várias técnicas de realce de imagens.
Nesta apostila vamos abordar o realce por histograma, que é uma
das técnicas mais populares e fáceis de se implementar, e
o realce por cores.
- Como apresentado na apostila anterior, o histograma de uma
imagem digital é uma tabela que relaciona cada valor de
nível de cinza com sua frequência de aparecimento na
imagem digital. Geralmente o Histograma é apresentado
através de um
gráfico que mostra a relação entre os
níveis de cinza (eixo x do gráfico) e a quantidade de
pixels com esses níveis de cinza (eixo y do
gráfico) como apresentado na figura abaixo.
Figura: Histograma de uma
imagem
digital
Realce por manipulação de
Histogramas
A idéia básica do realce por histograma envolve a
modificação da resposta radiométrica de uma imagem
original através de uma transformação que depende
do histograma dessa imagem.
O objetivo final é obter-se uma imagem cujo histograma
está completamente espalhado no domínio dos valores
determinados para a codificação da imagem. Por exemplo,
uma imagem com radiometria codificada com 8 bits , terá os
seus valores de radiometria originais transformados para a faixa de
valores entre 0 e 255.
A figura abaixo mostra uma imagem com histograma comprimido em valores
baixos. Essa imagem tem valor médio baixo e desvio padrão
também pequeno apresentando, por isso, uma aparência
escura e com baixo contraste.
Figura: Histograma de uma imagem
digital com média e variância baixas
Realce Linear
- Na
figura abaixo observamos a mesma imagem anterior, onde se aplicou um
contraste por histograma, agora com seu histograma melhor distribuido
em toda a faixa de domínio de codificação da
imagem.
Figura: Histograma de uma imagem digital com média e
variância altas
- O contraste por histograma é realizado através da
definição de uma função
de transferência que mapeia a faixa de valores de uma
imagem original para novos valores radiométricos mais bem
distribuídos num domínio de valores radiométricos
pré-estabelecidos.
- Quando a função de transferência é uma
reta, como mostrado na figura anterior, temos uma
transformação linear aplicada aos níveis digitais
da imagem.
- Para se determinar automaticamente a
transformação linear, Y = a*X + b, que deve ser
aplicada a uma imagem digital podemos seguir o procedimento:
- Percorre-se a imagem X para se descobrir seus valores
digitais mínimo e máximo, Xmin e Xmax. Opcionalmente
defina um Xmin e um Xmax baseado no histograma da imagem.
- Calcula-se o parâmetro a, da transformação,
pela relação: a= 255.0/(Xmax-Xmin) .
- Calcula-se o parâmetro b, da transformação,
pela relação: b=-a*Xmin .
- Aplica-se essa relação, Y = aX + b, para cada
valor de nível digital da imagem de entrada X obtendo-se o
nível digital da imagem de saída Y.
- Seja uma
imagem X, codificada com 8 bits, definida como abaixo:
- Da análise dos valores da imagem obtem-se:
Xmin = 4.0 e Xmax = 55.0
a = 255.0/(Xmax - Xmin) = 255.0/51.0 = 5.0
b =
-a*Xmin = -5.0*4.0 = -20
- Aplicando-se os valores de a e b, calculados acima, da
relação Y = a*X + b = 5.0*X - 20.0, em cada elemento da
imagem
X, obtemos
a seguinte imagem Y :
40
|
80
|
130
|
0
|
50
|
40
|
255
|
20
|
45
|
- Importante: O exemplo acima utiliza os valores digitais
máximos e mínimos da imagem. Esse método
automático de realce pode, em alguns casos, não ser
eficiente. Esse método não realiza nenhum realce na
imagem quando existe, pelo menos, um pixel com nível digital
mínimo e um pixel com nível digital máximo (255
para codificação com 8 bits). Você pode explicar
porque não se consegue realce quando isso ocorre?
- Muitas vezes a função de
transferência é aplicada em faixas de maior interesse do
usuário. Neste caso, os valores digitais fora da faixa
escolhida, são mapeadas
para 0 (quando o nível digital é menor do que o
valor mínimo escolhido) ou para 255 (quando o nível
digital é maior do que o valor máximo escolhido), em
imagens codificadas com 8 bits. O histograma pode ser usado como
referência para escolha da faixa de interesse. Você pode
definir um critério para escolha da faixa? Veja questão
nos exercícios.
Realces não lineares
- Podem existem outras possibilidades de
funções de transferência com suas
aplicações específicas.
- A figura abaixo mostra a
aplicação de uma função raiz quadrada, y = f(x) = ax1/2 , cuja
característica é realçar valores mais escuros da
imagem. A inclinação da função é
maior no início do que no fim da função.
- A figura abaixo mostra a aplicação de uma
função quadrática, y = f(x) = ax2 , cuja característica
é
realçar valores mais os valores mais claros da imagem, dando
menor realce aos valores escuros. A inclinação da reta
é mais acentuada no final da função do que no
início da mesma.
- A figura abaixo mostra a
aplicação de uma função inversa cuja
característica é inverter os valores dos píxels da
imagem. Valores mais claros se tornam escuros e valores mais escuros se
tornam claros.
- A figura abaixo mostra a aplicação de
uma
equalização de histograma cuja
característica é realçar de forma global a imagem
forçando a geração de um histograma equalizado (
com frequências aproximadamente iguais para todos os
níveis digitais ) da imagem resultante.
Realce de Imagens Multiespectrais
- Como visto acima, é possível realizar contrastes
individuais das bandas de uma imagem multiespectral. As figuras dos
exemplos acima foram obtidas
aplicando-se o realce por histograma do SPRING. Considerando-se que
você já tenha, no SPRING, um banco de dados com Planos de
Informação da categoria Imagens, basta ativar um PI de
uma
categoria Imagem do SPRING e escolher a opção Contraste
no menu Imagem da barra de menus do SPRING. O contraste é
realizado marcando-se com o botão esquerdo do mouse no
início do histograma (Xmin) e, com o botão direito do
mouse, no fim do histograma
- Também é possível realçar
composições coloridas. Basta mostrar uma
composição colorida numa das telas de
visualização do SPRING e, na sequência, realizar um
realce por histograma em cada uma das bandas utilizadas.
A figura abaixo ilustra o procedimento de criação de uma
composição colorida de bandas espectrais realçadas.
|
Outras técnicas de realce de Imagens
Digitais
- Existem outras técnicas de realce de imagens como por
exemplo por manipulação de cores e por filtragens de
diferentes tipos. Essas técnicas serão consideradas nas
próximas apostilas
Exercícios
Laboratório 4 - Aplicação de realce linear baseado
no histograma de uma imagem digital
- Faça um programa em Java, ou em C para ler uma imagem do
tipo RAW,
realçar a imagem utilizando realce linear por histograma e
salvar essa imagem em uma imagem realçada de saída (por
exemplo esta banda
3 da imagem de brasilia). Utilize o
código do programa no anexo, abaixo, e adapte-o, opcionalmente,
perguntar os valores mínimos e máximos para o
usuário.
- Visualize a imagem de saída no IrfanView por exemplo.O que
você observou?
- Faça um relatório sobre o laboratório e
coloque no seu portifolio do curso de Processamento de Imagens.
Observação: O
relatório deve ser digital e deve ser enviado para o e-mail do
professor ( carlos@dpi.inpe.br
) contendo:
Identificação do aluno (
nome, nro de matrícula, outros...) e data.
Nome do experimento do laboratório.
Uma introdução explicitando o objetivo do trabalho do
laboratório.
Uma descrição da metodologia utilizada para
resolver o problema.
Uma descrição dos resultados obtidos com análises
pertinentes.
Uma seção de conclusão com opiniões
próprias de cada
aluno e sugestões gerais relacionadas com o experimento.
Exercícios gerais
1. Visualize uma banda de uma imagem
digital no SPRING e aplique o realce por contraste nessa banda.
Repita o procedimento para uma composição colorida gerada
no SPRING.
2. Suponha que você tenha a imagem abaixo. Calcule os parametros
da
equação linear que realce essa imagem supondo que ela
possa ser codificada com 5 bits.
1 5 3 6 4 6
3 7 0 2 5 5
6 5 5 1 7 2
3. Aplique a
transformação determinada no exercicio 1 sobre a imagem
sugerida e apresente a imagem realçada.
4. Explique como você faria para realçar uma imagem
colorida com
3 componentes (RGB).
5. Nos realces apresentados acima, o histograma pode ser usado como
referência para escolha da faixa
de interesse dos níveis digitais da imagem de entrada .
Você pode definir um ou mais critérios para escolha dessas
faixas?
Apêndice: Programa em C para fazer o
realce de
uma imagem digital utilizando os níveis digitais mínimo e
máximo, presentes na imagem de entrada.
#include <stdio.h>
#include <malloc.h>
main()
{
FILE *fpi, *fpo;
unsigned char *buffer;
int nlin,ncol,l,c,cor,Xmin=10000, Xmax=-1000;
float a,b;
// Abre arquivo de entrada
fpi = fopen("banda5.raw","rb");
if(fpi==NULL){
printf("Arquivo nemorgb.raw nao existe");
getchar(); return 1;
}
// Cria arquivo de saida
fpo = fopen("banda5c.raw","wb");
if(fpo==NULL){
printf("Arquivo nemosaida.raw nao existe");
getchar(); return 1;
}
// Le nro de linhas e colunas do usuario
printf("\nEntre com o nro de
linhas da imagem: ");
scanf("%d",&nlin);
printf("\nEntre com o nro de
colunas da imagem: ");
scanf("%d",&ncol);
// Aloca dinamicamente o buffer de cada linha
buffer = malloc(ncol*sizeof(char));
if( buffer == NULL)
{
printf("Nao alocou memoria para o buffer");
getchar(); return 1;
}
// Percorre imagem, linha a linha
for(l=0; l<nlin; l++)
{
// Le linha l do arquivo de entrada
fread(buffer, sizeof(char), ncol,
fpi);
// Atualiza valores de Xmin e Xmax
for(c=0;
c<ncol; c++) {
if(buffer[c]>Xmax) Xmax=buffer[c];
if(buffer[c]<Xmin) Xmin=buffer[c];
}
}
// Calcula fatores a e b
a = 255.0/(Xmax-Xmin);
b = -a*Xmin;
// Retorna ao inicio da imagem e percorre imagem, linha a linha
rewind(fpi);
for(l=0; l<nlin; l++)
{
// Le linha l do arquivo de entrada
fread(buffer, sizeof(char), ncol,
fpi);
// Atualiza valores de Xmin e Xmax
for(c=0;
c<ncol; c++)
buffer[c]= a*buffer[c]+b;
// Escreve linha l no arquivo de saida
fwrite(buffer, sizeof(char), ncol,
fpo);
}
// Fecha arquivos e libera memória
alocada
fclose (fpi);
fclose (fpo);
free (buffer);
getchar();
}
|