Detection de contour d une image (j ai un probelem dans la partie du filtre)

najah01_3 Messages postés 35 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 17 juillet 2007 - 4 mai 2007 à 01:46
najah01_3 Messages postés 35 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 17 juillet 2007 - 3 juin 2007 à 05:17
Salam ;

je viens de faire detection de contour d une image noir et blanc . je devais faire la difference du pixel (i)(j)-(i-1)(j) =filter(-1f, 1f) .
j ai un probelem dans la partie du filtre

import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
 
public class NegatifImage extends Applet
{
  private Image image,
                negatifImage;
 
  public void init ()
  {     
    // Création d'une image et de son négatif
    image        = getImage (getCodeBase (), "image1.jpg");
    negatifImage = createImage (new FilteredImageSource
                                       (image.getSource (),
                                        new FiltreNegatif ()));
  }
 
  public void paint (Graphics gc)
  {
    if (image != null)
    {
      // Affichage des images
      gc.drawImage (image, 0, 0, this);
      gc.drawImage (negatifImage,
                     image.getWidth (this) + 10, 0, this);
    }
  }
}
 


class FiltreNegatif extends RGBImageFilter
{
  public FiltreNegatif ()
  {
  
 
  }
 
  public int filterRGB (int x, int y, int rgb)
  {
    float[] filter = {  -1.0f, 1.0f };
        Kernel kernel = new Kernel(2, 1, filter);
        ConvolveOp op = new ConvolveOp(kernel);
        return op.filter(image, null);
  }
}

4 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 mai 2007 à 15:28
Salam:

Ta méthode filterRGB est comment dire fausse, elle doit retourner un int par un BufferedImage.

Comme tu dois faire la différence entre deux pixels consécutifs tu peux procèder ainsi:

class FiltreNegatif extends RGBImageFilter {
      private int [] data;
      private int width;
      private int height;    

      public FiltreNegatif (BufferedImage bi) {
          this.width = bi.getWidth ();
          this.height = bi.getHeight ();
          this.data = new int [this.width * this.height];

          try {
             PixelGrabber pg = new PixelGrabber (bi,
                               0,
                               0,
                               this.width,
                               this.height,
                               this.data,
                               0,
                               this.width);
             pg.grabPixels ();
          }
          catch (InterruptedException err) {
                throw new RuntimeException ("Chargement interrompu ...");
          }
          if ((pg.getStatus () & ImageObserver.ABORT) != 0) {
            
throw new RuntimeException ("Chargement interrompu ...");


          }
      }
 
      public int filterRGB (int x, int y, int rgb) {
            // Extrémités
            if (y == 0) {
               return rgb;
            }

            // Déterminer le pixel précédeur
            int yPrevious = y - 1;
            if (yPrevious < 0) {
                yPrevious = this.width - 1;
            }

            int previousRGB = this.data [this.width * x + yPrevious];

            // Calculer la différence entre le pixel courant le pixel précédant
            // Personnellement je ne suis pas sûr que c'est la bonne formule
            // Est ce que on rétranche les deux nuances?
            // Ou
            // De faire la différence pour chaque nuance
            // (rouge - rouge, vert - vert, bleu - bleu)
            return (rgb - previousRGB); // A VOIR
      }
}




Comme je t'ai dit je ne suis pas pro en imagerie mais tu peux me dire quelle formule utilisée pour l'implémenter.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 mai 2007 à 15:30
Je n'ai pas fait attention qu fait que tu utilises l'objet Image au lieu de BufferedImage.

class FiltreNegatif extends RGBImageFilter {
      private int [] data;
      private int width;
      private int height;    

      public FiltreNegatif (Image image) {

          // ...
      }
}
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
4 mai 2007 à 21:39
Salut:

Petite correction:


public int filterRGB (int x, int y, int rgb) {
            // Extrémités
            if (y == 0) {
               return rgb;
            }

            int previousRGB = this.data [this.width * x + y - 1];

            // Calculer la différence entre le pixel courant le pixel précédant
            // Personnellement je ne suis pas sûr que c'est la bonne formule
            // Est ce que on rétranche les deux nuances?
            // Ou
            // De faire la différence pour chaque nuance
            // (rouge - rouge, vert - vert, bleu - bleu)
            return (rgb - previousRGB); // A VOIR
      }
0
najah01_3 Messages postés 35 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 17 juillet 2007
3 juin 2007 à 05:17
salam ,


je ai realisé le programme de detections de contour d une image blan/noir . lors de l execution un message d ereur dans la partie "public inter filterRGB (int x, int y, int rgb) " s affiche . voici mon programme .




 
public class NegatifImage extends Applet
{
  private Image image,
                negatifImage;
 
  public void init ()
  {     
    // Création d'une image et de son négatif
    image        = getImage (getCodeBase (), "image1.jpg");
    negatifImage = createImage (new FilteredImageSource
                                       (image.getSource (),
                                        new FiltreNegatif ()));
  }
 
  public void paint (Graphics gc)
  {
    if (image != null)
    {
      // Affichage des images
      gc.drawImage (image, 0, 0, this);
      gc.drawImage (negatifImage,
                     image.getWidth (this) + 10, 0, this);
    }
  }
}
 
class FiltreNegatif extends RGBImageFilter
{
  private int [] data ;
 private int width ;
 private int hight ;
 public FiltreNegatif (Image Image) {
          this.width = Image.getWidth ();
          this.height = Image.getHeight ();
          this.data = new int [this.width * this.height];


          try {
             PixelGrabber pg = new PixelGrabber (Image,
                               0,
                               0,
                               this.width,
                               this.height,
                               this.data,
                               0,
                               this.width);
             pg.grabPixels ();
          }
          catch (InterruptedException err) {
                throw new RuntimeException ("Chargement interrompu ...");
          }
          if ((pg.getStatus () & ImageObserver.ABORT) != 0) {
             throw new RuntimeException ("Chargement interrompu ...");
          }
       


  public int filterRGB (int x, int y, int rgb)  {
    if (y==0) {
                   return rgb ;
                   }
                  
     int yprevious = y-1 ; 
     if (yprevious < 0 )
     {
         yprevious = this.width - 1;
         }
 
  int previousRGB =this.data[this.width*x + yprevious] ;
 
  int r1 = (rgb >>16 ) & 0xFF;
  int g1= (rgb >>8 ) & 0xFF;
  int b1= rgb  & 0xFF; 
 
  int r2 = ( previousRGB>>16 ) & 0xFF;
  int g2= ( previousRGB>>8 ) & 0xFF ;
  int b2=  previousRGB & 0xFF;
 
  int r3=r1-r2 ;
  int g3=g1-g2 ;
  int b3=b1-b2 ;
                     
    return   r3 | g3 | b3;
  }
}
}


 
0
Rejoignez-nous