segunda-feira, 1 de junho de 2015

Exercício 17: Photocheap Filtros

O código a seguir, cria filtros para uma imagem para dar um ar de imagem envelhecida, o primeiro cria ruídos na imagem, o segundo deixa a imagem em tons de cinza, o terceiro deixa a imagem avermelhada, e o ultimo deixa a imagem amarelada, a seguir sera explicado como cada filtro atua.

Ruido: A variável pos guarda o numero  de pixels da imagem original que foi copiada, um numero randômico de inteiro de 0 até pos-1 é gerado para indicar um pixel da imagem, e nesse pixel é adicionado 16 a cada canal, esse numero pode ser ajustado. o numero de passos para o laços pode ser controlado, aumentando ou diminuído o numero de pixel a serem alterados,  no exemplo o numero de passos é 100000.

Cinza: Baseado na percepção das cores pelo ser humano cada cor da image, é multiplicado por um valor que representa a porcentagem de percepção que o ser humano tem daquela cor, depois uma variável media soma todos os canais já multiplicados, tendo assim a média ponderada das cores, e em todos os canais da imagem resultante a variável media é setada, resultando na imagem em tons de cinza.

Vermelho: O  filtro a seguir copia as cores G e B para a imagem resultante, e adiciona 64 ao canal R e copia para imagem resultante.,

Amarelo: Esse filtro é bem parecido com o ultimo, só que para adicionar amarelo, é necessário adicionar valor nos canais vermelho e verde.

Código-Fonte:

PImage img;
PImage imgRuido;
PImage imgCinza;
PImage imgRed;
PImage imgYellow;

float media,r,b,g;
int pos;
void setup(){
  size(800,600);
  img = loadImage("opa.jpg");
  imgRuido = createImage(640,447,RGB);
  imgCinza = createImage(640,447,RGB);
  imgRed = createImage(640,447,RGB);
  imgYellow = createImage(640,447,RGB);
 
  for (int x=0; x<640; x++) {
    for (int y=0; y<447; y++) {
      pos=y*640+x;
   
     imgRuido.pixels[pos] = img.pixels[pos];
     imgRed.pixels[pos] = img.pixels[pos];
     
    }

  }
    //Ruido
     int p =0;
     for (int i=0; i<100000; i++) {
          p = (int)random(0,pos-1);
         
           r=red(imgRuido.pixels[p])+16;
           g=green(imgRuido.pixels[p])+16;
           b=blue(imgRuido.pixels[p])+16;
         
          imgRuido.pixels[p] = color(r,g,b);
          imgCinza.pixels[p] = color(r,g,b);
     }
   
     //Cinza
     for (int x=0; x<640; x++) {
      for (int y=0; y<447; y++) {
        pos=y*640+x;
     
           r=red(imgRuido.pixels[pos])*0.3;
           g=green(imgRuido.pixels[pos])*0.59;
           b=blue(imgRuido.pixels[pos])*0.11;
         
           media = r+g+b;
     
       imgCinza.pixels[pos] = color(media,media,media);
     
       
        }
 
      }
   
     //Vermelho
     for (int x=0; x<640; x++) {
      for (int y=0; y<447; y++) {
        pos=y*640+x;
     
           r=red(imgCinza.pixels[pos])+64;
           g=green(imgCinza.pixels[pos]);
           b=blue(imgCinza.pixels[pos]);
     
       imgRed.pixels[pos] = color(r,g,b);
     
       
        }
 
      }
     
       //Amarelo
       for (int x=0; x<640; x++) {
        for (int y=0; y<447; y++) {
        pos=y*640+x;
     
           r=red(imgRed.pixels[pos])+64;
           g=green(imgRed.pixels[pos])+64;
           b=blue(imgRed.pixels[pos]);
     
       imgYellow.pixels[pos] = color(r,g,b);
     
       
        }
 
      }
     
 
}

void draw() {
  //image(img,0,0);
  //image(imgRuido,0,0);
  //image(imgCinza,0,0);
  //image(imgRed, 0, 0);
  image(imgYellow,0,0);
}

Nenhum comentário:

Postar um comentário