explicacao - PUC-Rio

Propaganda
Trabalho de Imagem
Felipe Baldino Moreira
Prof: Marcelo Gatass.
Disciplina Fundamentos de Computação
Gráfica
Comandos para utilizar o programa
• Esc – Sai
• ‘o’ - Recarrega a imagem original
• ‘b’ – Converte a imagem em Puro Preto e
Branco
• 'g‘ – Converte a Imagem em Tons de Cinza.
• 'G‘ – Aplica o Filtro de Gauss
• 's‘ – Aplica o Filtro de Sobel
• 'i‘ – Inverte as cores da Imagem
Converte a imagem em Puro Preto e
Branco
• A imagem é decomposta em tons de cinza e então, caso o pixel
tenha a cor maior que um threshold (que no caso foi utilizado 0,25)
o pixel fica Branco e Preto caso contrário.
Segue o Algoritmo aplicado a cada pixel:
r=r*0.299;
g=g*0.587;
b=b*0.144;
r=r+g+b;
if (r<0.25)
r=0.0;
else
r = 1.0;
g=r;
b=r;
Inverte as cores da Imagem
• A imagem tem suas cores invertidas como se
fosse um negativo.
• Cada cor que compõe o pixel tem seu valor
subtraído de um.
Segue o Algoritmo aplicado a cada pixel:
r=1-r;
g=1-g;
b=1-b;
Converte a imagem Tons de Cinza
• É feita uma correlação entre as cores, de modo que elas
somadas representem o tom de cinza esperado para o
pixel.
Neste caso, o vermelho (r) é multiplicado por 0.299, o Verde
(g) por 0.587 e o azul (b) por 0.144.
r=r*0.299;
g=g*0.587;
b=b*0.144;
r=r+g+b;
Após esta correção não é possível mais se visualizar as cores, e
todas parecem como tons de cinza.
Converte a imagem Tons de Cinza
• É feita uma correlação entre as cores, de modo que elas
somadas representem o tom de cinza esperado para o
pixel.
Neste caso, o vermelho (r) é multiplicado por 0.299, o Verde
(g) por 0.587 e o azul (b) por 0.144.
r=r*0.299;
g=g*0.587;
b=b*0.144;
r=r+g+b;
Após esta correção não é possível mais se visualizar as cores, e
todas parecem como tons de cinza.
Filtro de Gauss
• É feita aplicação da matriz gaussinana na imagem
e seu resultado é que a imagem fica borrada.
Segue a definição da Matriz gaussiana :
#define det 4.0
float
gaussianfilter[3][3]={(1.0/det,2.0/det,1.0/det),(2.
0/det,4.0/det,2.0/det),(1.0/det,2.0/det,1.0/det)};
Void applygaussian(void)
int i,j,ii,jj;
double r,rr,g,gg,bb,b,gbuffer[3];
RgbImage Imagem_final(filename);
unsigned char *img;
img= (unsigned char *) Imagemoriginal->ImageData();
for(i=1;i<Imagemoriginal->GetNumRows()-1;i++)
{
for(j=1;j<Imagemoriginal->GetNumCols()-1;j++)
{
gbuffer[0]=0.0f;
gbuffer[1]=0.0f;
gbuffer[2]=0.0f;
for (ii=0;ii<3;ii++)
{
for(jj=0;jj<3;jj++)
{
Imagemoriginal->GetRgbPixel(i+ii-1,j+jj-1,&rr,&gg,&bb);
gbuffer[0]=gbuffer[0]+gaussianfilter[ii][jj]*rr;
gbuffer[1]=gbuffer[1]+gaussianfilter[ii][jj]*gg;
gbuffer[2]=gbuffer[2]+gaussianfilter[ii][jj]*bb;
}
}
Imagem_final.SetRgbPixelf(i,j,gbuffer[0],gbuffer[1],gbuffer[2]);
}
}
Filtro de Sobel
• É um filtro utilizado para detectar contornos.
• Este filtro ressalta os contornos das imagens.
• Utiliza duas matrizes, uma para o eixo X e
outra para o eixo y listadas abaixo.
float
Gx[3][3]={(1.0,0.0,-1.0),(2,0,-2),(1.0,0,-1.0)},
Gy[3][3]={(1.0,2.0,1.0),(0,0,0),(-1.0,-2.0,-1.0)};
void applysobel(void)
{ int i,j,ii,jj; double r,rr,g,gg,bb,b,gbufferx[3],gbuffery[3],GX,GY;
RgbImage Imagem_final(filename); unsigned char *img; img= (unsigned char *) Imagemoriginal>ImageData();
for(i=1;i<Imagemoriginal->GetNumRows()-1;i++)
{ for(j=1;j<Imagemoriginal->GetNumCols()-1;j++)
{gbufferx[0]=0.0f; gbufferx[1]=0.0f; gbufferx[2]=0.0f; gbuffery[0]=0.0f;
gbuffery[1]=0.0f; gbuffery[2]=0.0f;
for (ii=0;ii<3;ii++)
{
for(jj=0;jj<3;jj++)
{ Imagemoriginal->GetRgbPixel(i+ii-1,j+jj-1,&rr,&gg,&bb);
gbufferx[0]=gbufferx[0]+Gx[ii][jj]*rr; gbufferx[1]=gbufferx[1]+Gx[ii][jj]*gg;
gbufferx[2]=gbufferx[2]+Gx[ii][jj]*bb;
gbuffery[0]=gbuffery[0]+Gy[ii][jj]*rr; gbuffery[1]=gbuffery[1]+Gy[ii][jj]*gg;
gbuffery[2]=gbuffery[2]+Gy[ii][jj]*bb; }
for(jj=0;jj<3;jj++)
{ gbufferx[jj]=gbufferx[jj]*gbufferx[jj];
gbuffery[jj]=gbuffery[jj]*gbuffery[jj]; }
}
Imagem_final.SetRgbPixelf(i,j,sqrt(gbufferx[0]-gbuffery[0]),sqrt(gbufferx[1]-gbuffery[1]),sqrt(gbufferx[2]gbuffery[2]));
}
}
}
Download