Mascaras


Lena.jpg

   A Lena é sem duvida a imagem mais utilizada em Processamento digital de imagens, cada vez que alguem quer mostrar, testar ou provar algo usa esta foto, desta vez nao vai ser diferente :).
   Um dos trabalhos da materia de Visão Computacional, foi aplicar os métodos de Sobel e Roberts de detecção de bordas em uma imagem qualquer.    Por mais incrível que pareça os métodos são simples mas muito eficientes.
   A baixo estão disponiveis: os códigos fonte dos dois métodos de detecção de bordas, um de binarização e o Histograma. O Trabalho completo funciona com qualquer imagem no formato .pgm.

O Trabalho Completo (1,5KB)
Lena.pgm.gz (compactada) (217KB)

Histograma da imagem

*****************************************************************
função para criação do Histograma, gera um arquivo para ser lido
pelo Gnuplot.
Gray *Fonte -> Estrutura que contem a imagem
char *filename -> Arquivo a gravado o Histograma
*****************************************************************
void Histograma(Gray *Fonte,char *FileName){
int y,x;
int valores [256];/*valores para o histograma/
FILE *File=fopen(FileName,"w+");

/*Zera variável auxiliar */
for (y=0;y<256;y++) /* zera o vetor */
    valores[y]=0;

/* Lê valores da estrutura */
for (y=0;y<Fonte->Height;y++)
     for (x=0;x<Fonte->Width;x++)
         valores[(unsigned char)Fonte->Data[x][y]]+=1;

     /*Grava arquivo para o gnuplot*/
     for (y=0;y<256;y++)
         fprintf(File,"%d\n",valores[y]);

     fflush(File);
     fclose (File);

}/* Histograma */
 

Imagem da Lena Binarizada segundo um Limiar

********************************************************************
     função para binarização de uma imagem, segundo um limiar passado
     como parâmetro.

     Gray *Fonte -> Estrutura que contem a imagem
     Gray *Nova -> Estrutura que conterá a imagem binarizada
     int Limiar -> Limiar de binarização da imagem
******************************************************************* */

void Binariza(Gray Fonte, Gray *Nova, int Limiar){
     int y,x;

     Nova->Height=Fonte.Height;
     Nova->Width=Fonte.Width;

     for (y=0;y<Fonte.Height;y++)
         for (x=0;x<Fonte.Width;x++)
             Nova->Data[x][y]=((unsigned char)Fonte.Data[x][y]>Limiar)?255:0;

}/*Binariza*/

Detecção de Bordas pelo método de Roberts
********************************************************************
     função para detecção de bordas de uma imagem, pelo método de
     Roberts segundo um limiar passado
     como parâmetro. Se este limiar for maior q. 255 considera-se sem limiar.

     Gray *Fonte -> Estrutura que contem a imagem
     Gray *Nova -> Estrutura que conterá a imagem de bordas
     int Limiar -> Limiar de binarizacao da imagem

 ********************************************************************

void Roberts(Gray Fonte, Gray *Nova, int Limiar){
     int y,x;
     int tmp;

     Nova->Height=Fonte.Height;
     Nova->Width=Fonte.Width;

     for (y=0;y<Fonte.Height-1;y++)
         for (x=0;x<Fonte.Width-1;x++){
             tmp = sqrt((pow((Fonte.Data[x+1][y+1] - Fonte.Data[x][y]),2) +
                                       pow((Fonte.Data[x+1][y] - Fonte.Data[x][y+1]),2)));

             if(Limiar>255)
                 Nova->Data[x][y]=tmp;
             else
                 Nova->Data[x][y]=(tmp>Limiar)?255:0;
      }/*for*/

}/*Roberts*/

Detecção de Bordas pelo método de Sobel

********************************************************************

função para detecção de bordas de uma imagem, pelo método de

Sobel segundo um limiar passado

como parâmetro. Se este limiar for 0(Zero) considera-se sem limiar.

 

Gray *Fonte -> Estrutura que contem a imagem

Gray *Nova -> Estrutura que conterá a imagem de bordas

int Limiar -> Limiar de binarização da imagem

********************************************************************
void Sobel(Gray Fonte, Gray *Nova, int Limiar){
  int y,x;
  int tmp;
  int tmpX,tmpY;
  unsigned char M[3][3],N[3][3];

  Nova->Height=Fonte.Height;
  Nova->Width=Fonte.Width;

 
  for (y=1;y<Fonte.Height-1;y++)
     for (x=1;x<Fonte.Width-1;x++){
         tmpX=tmpY=0;

          tmpX=-Fonte.Data[x-1][y-1]-2*Fonte.Data[x][y-1]-Fonte.Data[x+1][y-1]+
                      Fonte.Data[x-1][y+1]+2*Fonte.Data[x][y+1]+Fonte.Data[x+1][y+1];

          tmpY=-Fonte.Data[x-1][y-1]+Fonte.Data[x+1][y-1]-2*Fonte.Data[x-1][y]+
                            2*Fonte.Data[x+1][y]-Fonte.Data[x-1][y+1]+Fonte.Data[x+1][y+1];

          tmp =(int)(sqrt((pow(tmpX,2) + pow(tmpY,2))));

          if(Limiar >255)
            Nova->Data[x][y]=tmp;
          else
            Nova->Data[x][y]=(tmp>Limiar)?255:0;
 
    }/*for*/
}/*Sobel*/
 


Daniel Câmara
Last modified: Thu Sep 3 19:44:58 EST 1998