Traitement d'image en java

cs_raidana Messages postés 14 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 4 mai 2009 - 21 nov. 2008 à 10:11
cs_raidana Messages postés 14 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 4 mai 2009 - 21 nov. 2008 à 18:53
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

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
21 nov. 2008 à 10:35
L'erreur vient de la ligne 245 de ta source java.
0
cs_raidana Messages postés 14 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 4 mai 2009
21 nov. 2008 à 10:43
il parait (bien sur) que vous avez jeter un coup d'oeil sur ma source que vous n'avez pas demander meme.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
21 nov. 2008 à 11:05
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
0
cs_raidana Messages postés 14 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 4 mai 2009
21 nov. 2008 à 11:11
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
21 nov. 2008 à 12:28
  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.
0
cs_raidana Messages postés 14 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 4 mai 2009
21 nov. 2008 à 12:43
si j'ai bien compris le pb est dans ce null
imgOriginal.getImage().getWidth(null),imgOriginal.getImage().getHeight(null), BufferedImage.TYPE_INT_RGB);
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
21 nov. 2008 à 14:06
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()
0
cs_raidana Messages postés 14 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 4 mai 2009
21 nov. 2008 à 14:15
merci pour ton aide
je suis vraiement reconnaissant
0
cs_raidana Messages postés 14 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 4 mai 2009
21 nov. 2008 à 18:53
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
0
Rejoignez-nous