Traitement des images point par point

Aller en bas

Traitement des images point par point Empty Traitement des images point par point

Message  Gus le Ven 8 Juil - 17:34

J'utilise deux approches pour traiter les images :

  1. soit j'utilise les fonctionnalités de l'API JAI (Java Advanced Imaging).
  2. soit je parcours chaque point de l'image dans une double boucle pour les traiter un à un.

C'est cette deuxième option que je vais vous montrer dans ce post.

Tout d'abord il est nécessaire de mettre l'image sous la forme standardisée de BufferedImage de type TYPE_INT_RGB (image RBG 8 bits). Voici l'entité de transformation que j'ai crée à cet effet :

gus.image.convert.tobufferedimage
Code:
package gus05.entity.gus.image.convert.tobufferedimage;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import javax.swing.Icon;
import gus05.framework.core.Entity;
import gus05.framework.features.Transform;

public class ToBufferedImage implements Entity, Transform {

    public String getName()            {return "gus.image.convert.tobufferedimage";}
    public String getCreationDate()      {return "2011.07.07";}


    public Object transform(Object obj) throws Exception
    {
       if(obj instanceof BufferedImage) return (BufferedImage) obj;
       if(obj instanceof RenderedImage) return toBufferedImage((RenderedImage) obj);
       if(obj instanceof Image) return toBufferedImage((Image) obj);
       if(obj instanceof Icon) return toBufferedImage((Icon) obj);
       
       throw new Exception("Invalid data type: "+obj.getClass().getName());
    }
   
    private BufferedImage toBufferedImage(Image image)
    {
       BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
       Graphics2D g = buffImg.createGraphics();
       g.drawImage(image,0,0,null);
       g.dispose();
       return buffImg;
    }
   
    private BufferedImage toBufferedImage(RenderedImage image)
    {
       BufferedImage buffImg = new BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_RGB);
       Graphics2D g = buffImg.createGraphics();
       g.drawRenderedImage(image,AffineTransform.getTranslateInstance(0,0));
       g.dispose();
       return buffImg;
    }
   
    private BufferedImage toBufferedImage(Icon icon)
    {
       BufferedImage buffImg = new BufferedImage(icon.getIconWidth(),icon.getIconHeight(),BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffImg.createGraphics();
      icon.paintIcon(null,g,0,0);
      g.dispose();
        return buffImg;
    }
}

Une fois qu'on a notre objet BufferedImage, il ne reste plus qu'à parcourir chacun de ces points dans une double boucle comme dans la méthode transform ci-dessous :

public Object transform(Object obj) throws Exception
{
BufferedImage image = (BufferedImage) toBufferedImage.transform(obj);
int width = image.getWidth();
int heigth = image.getHeight();

BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();

for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
{
int rgb = image.getRGB(i,j);
Color c = new Color(rgb);
// on modifie la couleur du point ici....
g.setColor(c);
g.drawRect(i,j,1,1);
}
g.dispose();
return buffImg;
}


Voici deux exemples simples d'utilisation de cette technique pour assombrir ou éclaircir une image.

Image d'origine :
Traitement des images point par point Mononoke_original

gus.image.transform.rendered.color.darker
Code:
package gus05.entity.gus.image.transform.rendered.color.darker;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import gus05.framework.core.Entity;
import gus05.framework.core.Outside;
import gus05.framework.core.Service;
import gus05.framework.features.Transform;

public class ImageColorDarker implements Entity, Transform {

    public String getName()            {return "gus.image.transform.rendered.color.darker";}
    public String getCreationDate()      {return "2011.07.07";}

    private Service toBufferedImage;
   
    public ImageColorDarker() throws Exception
    {toBufferedImage = Outside.service(this,"gus.image.convert.tobufferedimage");}

    public Object transform(Object obj) throws Exception
    {
       BufferedImage image = (BufferedImage) toBufferedImage.transform(obj);
       int width = image.getWidth();
       int heigth = image.getHeight();
       
       BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
       Graphics2D g = buffImg.createGraphics();
       
       for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
       {
          int rgb = image.getRGB(i,j);
          Color c = new Color(rgb);
          
          g.setColor(c.darker());
          g.drawRect(i,j,1,1);
       }
       g.dispose();
       return buffImg;
    }
}
Traitement des images point par point Mononoke_darker

gus.image.transform.rendered.color.brighter
Code:
package gus05.entity.gus.image.transform.rendered.color.brighter;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import gus05.framework.core.Entity;
import gus05.framework.core.Outside;
import gus05.framework.core.Service;
import gus05.framework.features.Transform;

public class ImageColorBrighter implements Entity, Transform {

    public String getName()            {return "gus.image.transform.rendered.color.brighter";}
    public String getCreationDate()      {return "2011.07.07";}

    private Service toBufferedImage;
   
    public ImageColorBrighter() throws Exception
    {toBufferedImage = Outside.service(this,"gus.image.convert.tobufferedimage");}

    public Object transform(Object obj) throws Exception
    {
       BufferedImage image = (BufferedImage) toBufferedImage.transform(obj);
       int width = image.getWidth();
       int heigth = image.getHeight();
       
       BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
       Graphics2D g = buffImg.createGraphics();
       
       for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
       {
          int rgb = image.getRGB(i,j);
          Color c = new Color(rgb);
          
          g.setColor(c.brighter());
          g.drawRect(i,j,1,1);
       }
       g.dispose();
       return buffImg;
    }
}
Traitement des images point par point Mononoke_brighter

Bien sûr la plupart des traitements possibles sont déjà prévus dans l'API JAI mais cette approche bien que peu performante permet vraiment de personnaliser les traitements d'une manière extrêmement fine si nécessaire. Personnellement, j'y ai recours sans doute trop souvent mais l'essentiel est de mettre en place des entités de traitement opérationnelles quitte à les remplacer plus tard par d'autres plus performantes.
Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

Voir le profil de l'utilisateur http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum