sábado, 10 de março de 2012

Efeito Threshold

O efeito threshold é um método de segmentação que faz com que a foto fique com apenas duas cores utilizando um valor limite. No nosso caso, vamos utilizar a cor preta e a cor branca. Para escolher o threshold utilizaremos a média total dos valores de cada cor do RGB. Se um pixel tem uma das cores maior que o threshold então o pixel receberá a cor branca (255,255,255). Caso contrário, o pixel receberá a cor preta (0,0,0).


import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Duplica {
 public static void main(String args[] ) throws IOException{

  BufferedImage imagem = null;
  imagem = ImageIO.read(
  new File("C:\\Users\\ufc\\workspace\\PDI\\src\\teste.jpg")
  );
  
  int w = imagem.getWidth();
  int h = imagem.getHeight();
  //retorna um vetor inteiro representando os pixels da imagem
  int pixels[] = imagem.getRGB(0, 0, w, h, null, 0, w);

  double mediaR = 0.0;
  double mediaG = 0.0;
  double mediaB = 0.0;
  double mediaT = 0.0;

  for (int col = 0; col < w; col++) {
    for (int lin = 0; lin < h; lin++) {
      //Pega a cor em cada pixel
      Color c = new Color(pixels[lin*w + col]);
      mediaR += (double)c.getRed()/(w*h);
      mediaG += (double)c.getGreen()/(w*h);
      mediaB += (double)c.getBlue()/(w*h);
      mediaT += (double)(c.getRed() + c.getGreen() + c.getBlue())/(3*w*h);         
           }

        }
        System.out.println("media do vermelho: " + mediaR);
        System.out.println("media do verde: " + mediaG);
        System.out.println("media do azul: " + mediaB);
        System.out.println("media do total: " + mediaT);
        int threshold = (int)mediaT;
        for (int col = 0; col < w; col++) {
       for (int lin = 0; lin < h; lin++) {
       int r,g,b;
       //Pega a cor em cada pixel
       Color c = new Color(pixels[lin*w + col]);
       if(c.getRed() > threshold || 
         c.getGreen() > threshold ||
         c.getBlue() > threshold) 
                     { r=255; g = 255; b = 255; }
       else {
   r =0; g = 0; b =0;
        }
     
        pixels[lin*w + col] = new Color(r, g , b).getRGB();
  }
      }
  
      //seta um vetor inteiro representando os pixels da imagem
      imagem.setRGB(0, 0, w, h, pixels, 0, w);
             ImageIO.write(imagem, "JPG", new File("C:\\Users\\ufc\\workspace\\PDI\\src\\teste2.jpg"));
 }
 
}

Exemplos:





Nenhum comentário: