3/3/11

Posterizar imagenes en Java2d (Filtro Posterize)


Posterizar una imagen es reducir el tono de sus colores a una gama mas uniforme tipo "Poster"



Teniendo una gama de colores :

RGB: 66,66,91
RGB: 131,138,211
RGB: 73,80,214

Se reducira la diferencia entre estos mediante la formula:

NuevoColorRGB = Color_RGB - (Color_RGB MOD NIVEL)

Donde Nivel podra tomar valores entre 1 y 255

Ej:
Nivel: 100

RGB: 66,66,91

R: 66 - (66 mod 100) = 0
G: 66 - (66 mod 100) = 0
B: 91 - (91 mod 100) = 0

RGB: 131,138,211

R: 131 - (131 mod 100) = 100
G: 138 - (138 mod 100) = 100
B: 211 - (211 mod 100) = 200

RGB: 73,80,214
    
R: 73 - (73 mod 100) = 0
G: 80 - (80 mod 100) = 0
B: 214 - (214 mod 100) = 200

Gama de Colores Original


Despues del Posterizado


Clase: posterize.java
Codigo Fuente:

import java.awt.Color;
import java.awt.image.BufferedImage;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class posterize {
    private BufferedImage foto;    
    private int r,g,b;
    private Color c;
    
    public posterize(){}

    public void SetPosterize(BufferedImage f, int nivel){
        this.foto = f;        
        for(int i=0;i<foto.getWidth();i++){
          for(int j=0;j<foto.getHeight();j++){  
                //Se obtiene el color RGB de cada pixel
                c = new Color(foto.getRGB(i, j));              
                r = c.getRed();
                g = c.getGreen();
                b = c.getBlue();
                //Se calcula el valor para la Posterización
                r = (r - (r % nivel));
                g = (g - (g % nivel));
                b = (b - (b % nivel));
                //se añade los nuevos valores
                foto.setRGB(i, j, new Color(r,g,b).getRGB());                                                                    
          }
        }        
    }
    
    public BufferedImage getFoto(){
        return this.foto;
    }
    
}

Implementando esta clase, tenemos a diferentes valores del parametro de calculo "Nivel":

Nivel : 50
Nivel: 100
Nivel: 150
A mayor valor de "Nivel", la imagen se ira haciendo más uniforme

No hay comentarios:

Publicar un comentario