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])); } } }