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




Figura: Histograma de uma imagem digital
     

Up

Realce por manipulação de Histogramas


digitalizacao

Figura: Histograma de uma imagem digital com média e variância baixas

       Realce Linear


digitalizacao

  Figura: Histograma de uma imagem digital com média e variância altas

12
20
30
4
14
10
55
8
13
           
    • 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



       Realces não lineares











  



     

Up

Realce de Imagens Multiespectrais


                A figura abaixo ilustra o procedimento de criação de uma composição colorida de bandas espectrais realçadas.







Up

Outras técnicas de realce de Imagens Digitais


 
Up

Exercícios

Laboratório 4 - Aplicação de realce linear baseado no histograma de uma imagem digital
  1. 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.
  2. Visualize a imagem de saída no IrfanView por exemplo.O que você observou?
  3. 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?



 
Up

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();

}

Up