Traitement d'image en java

Signaler
Messages postés
14
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009
-
Messages postés
14
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009
-
Bonjour,
je suis débutante en traitement d'image et java.
je dois développer une application de traitement d'image.
j'ai commencé à réaliser cet application en cherchant des codes par tout et j'ai rassemblé qq codes.Maintenant il reste de les maitriser et les intégrer. J'ai rencontré le pb suivant :
le résultat de l'algorithme filtre gaussien flou m'affiche un image tout en noir et je ne comprend pas pourquoi et je n'ai pas su comment intégré le filtre gaussien et le filtre Median.
le temps coule.Est ce qu'il y a qq qui peut m'aider
merci d'avance

9 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
L'erreur vient de la ligne 245 de ta source java.
Messages postés
14
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009

il parait (bien sur) que vous avez jeter un coup d'oeil sur ma source que vous n'avez pas demander meme.
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
97
Salut,

merci de donner le code en cause (ou portion de code) afin d'orienter l'aide de la meilleur façon possible et surtout éviter de poster pour ne rien dire afin que personne ne perde son temps inutilement ...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
14
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009

import java.awt.image.*;


public class GaussianFilter extends ConvolveFilter {


 static final long serialVersionUID = 5377089073023183684L;


 protected float radius;
 protected Kernel kernel;
 
 /**
  * Construct a Gaussian filter
  */
 public GaussianFilter() {
  this(2);
 }


 /**
  * Construct a Gaussian filter
  * @param radius blur radius in pixels
  */
 public GaussianFilter(float radius) {
  setRadius(radius);
 }


 /**
  * Set the radius of the kernel, and hence the amount of blur. The bigger the radius, the longer this filter will take.
  * @param radius the radius of the blur in pixels.
  */
 public void setRadius(float radius) {
  this.radius = radius;
  kernel = makeKernel(radius);
 }
 
 /**
  * Get the radius of the kernel.
  * @return the radius
  */
 public float getRadius() {
  return radius;
 }


    public BufferedImage filter( BufferedImage src, BufferedImage dst) {
        int width = src.getWidth();
        int height = src.getHeight();
      


        if ( dst == null )
            dst = createCompatibleDestImage( src, null );


        int[] inPixels = new int[width*height];
        int[] outPixels = new int[width*height];
        src.getRGB( 0, 0, width, height, inPixels, 0, width );


  convolveAndTranspose(kernel, inPixels, outPixels, width, height, alpha, CLAMP_EDGES);
  convolveAndTranspose(kernel, outPixels, inPixels, height, width, alpha, CLAMP_EDGES);


        dst.setRGB( 0, 0, width, height, inPixels, 0, width );
        return dst;
    }


 public static void convolveAndTranspose(Kernel kernel, int[] inPixels, int[] outPixels, int width, int height, boolean alpha, int edgeAction) {
  float[] matrix = kernel.getKernelData( null );
  int cols = kernel.getWidth();
  int cols2 = cols/2;


  for (int y = 0; y < height; y++) {
   int index = y;
   int ioffset = y*width;
   for (int x = 0; x < width; x++) {    float r 0, g 0, b = 0, a = 0;
    int moffset = cols2;
    for (int col = -cols2; col <= cols2; col++) {
     float f = matrix[moffset+col];


     if (f != 0) {
      int ix = x+col;
      if ( ix < 0 ) {
       if ( edgeAction == CLAMP_EDGES )
        ix = 0;
       else if ( edgeAction == WRAP_EDGES )
        ix = (x+width) % width;
      } else if ( ix >= width) {
       if ( edgeAction == CLAMP_EDGES )
        ix = width-1;
       else if ( edgeAction == WRAP_EDGES )
        ix = (x+width) % width;
      }
      int rgb = inPixels[ioffset+ix];
      a += f * ((rgb >> 24) & 0xff);
      r += f * ((rgb >> 16) & 0xff);
      g += f * ((rgb >> 8) & 0xff);
      b += f * (rgb & 0xff);
     }
    }
    int ia = alpha ? PixelUtils.clamp((int)(a+0.5)) : 0xff;
    int ir = PixelUtils.clamp((int)(r+0.5));
    int ig = PixelUtils.clamp((int)(g+0.5));
    int ib = PixelUtils.clamp((int)(b+0.5));
    outPixels[index] = (ia << 24) | (ir << 16) | (ig << 8) | ib;
                index += height;
   }
  }
 }


 /**
  * Make a Gaussian blur kernel.
  */
 public static Kernel makeKernel(float radius) {
  int r = (int)Math.ceil(radius);
  int rows = r*2+1;
  float[] matrix = new float[rows];
  float sigma = radius/3;
  float sigma22 = 2*sigma*sigma;
  float sigmaPi2 = 2*ImageMath.PI*sigma;
  float sqrtSigmaPi2 = (float)Math.sqrt(sigmaPi2);
  float radius2 = radius*radius;
  float total = 0;
  int index = 0;
  for (int row = -r; row <= r; row++) {
   float distance = row*row;
   if (distance > radius2)
    matrix[index] = 0;
   else
    matrix[index] = (float)Math.exp(-(distance)/sigma22) / sqrtSigmaPi2;
   total += matrix[index];
   index++;
  }
  for (int i = 0; i < rows; i++)
   matrix[i] /= total;


  return new Kernel(rows, 1, matrix);
 }


 public String toString() {
  return "Blur/Gaussian Blur...";
 }
}
/////////////////Dans mon appel j'ai écrit le suivant
private class ActionFiltreGausienfImage implements ActionListener {


        public void actionPerformed(ActionEvent e1) {
         //throw new UnsupportedOperationException("Not supported yet.");
         
         BufferedImage bufsc = new BufferedImage(imgOriginal.getImage().getWidth(null), imgOriginal.getImage().getHeight(null), BufferedImage.TYPE_INT_RGB);
         BufferedImage  imageFiltree = (new GaussianFilter()).filter(bufsc,null);
            imgOriginal.setImage(imageFiltree);
            App.this.repaint();
     
           


        }
    }
/////////Il retourne une image tout en noir
je ne comprend pas pourquoi
merci d'avance
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
  Re,
ton problème vient d'ici :
       BufferedImage bufsc = new BufferedImage(imgOriginal.getImage().getWidth(null),
                                                                    imgOriginal.getImage().getHeight(null),
                                                                    BufferedImage.TYPE_INT_RGB);

=> doit généré une image bufsc noire         BufferedImage  imageFiltree (new GaussianFilter()).filter(bufsc,null);> filtre sur une image noire.
            imgOriginal.setImage(imageFiltree);

Tu filtres l'image bufsc alors que celle si est a priori une image tout noir, tu ne récupéré que la taille de imageOriginal. Il faudrait utiliser les methodes getData ou copyData pour initialiser correctement bufsc.
Messages postés
14
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009

si j'ai bien compris le pb est dans ce null
imgOriginal.getImage().getWidth(null),imgOriginal.getImage().getHeight(null), BufferedImage.TYPE_INT_RGB);
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
non ce n'est pas le null qui pose problème;
mais quand tu fais BufferedImage bufsc = new BufferedImage(imgOriginal.getImage().getWidth(null),
                                                                    imgOriginal.getImage().getHeight(null),
                                                                    BufferedImage.TYPE_INT_RGB);

ca te crée une image qui à la meme taille que imgOriginal, mais par contre le contenu de imgOriginal n'est pas copié dans bufsc. bufsc est donc une nouvelles image qui doit être noire.
Tu dois rajouter
Graphics2D g2d <code class="java_operator">=
</code>bufsc
.<code class="java_function">createGraphics
();
</code>
g2d <code class="java_operator">
</code>
.<code class="java_function">drawImage
(</code>imgOriginal
,<code class="java_digit">0
,
0
,
null
);</code> // dessine imgOriginal dans bufsc.
g2d.<code class="java_function">dispose
();
</code>
ou alors

imabufsc.setData(imgOriginal.getData());

pour copier les pixel de imgOriginal dans bufsc.

par ailleurs tu peux remplacer imgOriginal.getImage().getWidth(null) par imgOriginal.getImage().getWidth()
Messages postés
14
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009

merci pour ton aide
je suis vraiement reconnaissant
Messages postés
14
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009

Salut,
Est ce qu'il ya qq qui peut m'aider à saisir la différence entre le "filtre gaussien","le filtre gaussien flou" et "le filtre gaussien smooth".
merci d'avance