IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

je dois appliquer un filtre gaussien sur mon image


Sujet :

Traitement d'images

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Points : 41
    Points
    41
    Par défaut je dois appliquer un filtre gaussien sur mon image
    Bonjour tout le monde, je dois appliquer un filtre gaussien sur mon image. y a t-il quelqu'un qui peut m'aider sachant que j'implémente en java?
    merci beaucoup

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    qu'est ce que tu veux savoir exactement sur ton filtre Gaussien ?
    Comment on pré-calcule le noyau ?
    Comment on applique le filtre ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Points : 41
    Points
    41
    Par défaut
    Bonjour,
    En fait, je veux calculer le noyau étant donné que la fenêtre du noyau est égale à 20 ensuite appliquer le noyau sur mon image.
    En fait, j'ai trouvé ce code en ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
     
    import java.applet.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.net.*;
    import java.util.*;
    import java.io.*;
    import java.lang.Math.*;
    import java.awt.Color.*;
     
    /**
     * Contains the functionality to generate a gaussian filter kernel and apply
     * it to an image.
     *
     * @author Simon Horne.
     */
    public class FiltreGaussien extends Thread {
     
      /**
       * Default no-args constructor.
       */
      public  FiltreGaussien() {
      }
     
      /**
       * Calculates the discrete value at x,y of the 
       * 2D gaussian distribution.
       *
       * @param theta     the theta value for the gaussian distribution
       * @param x         the point at which to calculate the discrete value
       * @param y         the point at which to calculate the discrete value
       * @return          the discrete gaussian value
       */
      public static double gaussianDiscrete2D(double theta, int x, int y){
        double g = 0;
        for(double ySubPixel = y - 0.5; ySubPixel < y + 0.55; ySubPixel += 0.1){
          for(double xSubPixel = x - 0.5; xSubPixel < x + 0.55; xSubPixel += 0.1){
    	g = g + ((1/(2*Math.PI*theta*theta)) * 
    		 Math.pow(Math.E,-(xSubPixel*xSubPixel+ySubPixel*ySubPixel)/
    			  (2*theta*theta)));
          }
        }
        g = g/121;
        //System.out.println(g);
        return g;
      }
     
      /**
       * Calculates several discrete values of the 2D gaussian distribution.
       *
       * @param theta     the theta value for the gaussian distribution
       * @param size      the number of discrete values to calculate (pixels)
       * @return          2Darray (size*size) containing the calculated 
       * discrete values
       */
      public static double [][] gaussian2D(double theta, int size){
        double [][] kernel = new double [size][size];
        for(int j=0;j<size;++j){
          for(int i=0;i<size;++i){
    	kernel[i][j]=gaussianDiscrete2D(theta,i-(size/2),j-(size/2));
          }
        }
     
        double sum = 0;
        for(int j=0;j<size;++j){
          for(int i=0;i<size;++i){
    	sum = sum + kernel[i][j];
     
          }
        }
     
        return kernel;
      }
     
      /**
       * Takes an image and a gaussian distribution, calculates an 
       * appropriate kernel and applies a convolution to smooth the image.
       *
       * @param 2D array representing the input image
       * @param w width of the image
       * @param h height of the image
       * @param ks the required size of the kernel
       * @param theta the gaussian distribution
       * @return 2D array representing the smoothed image
       */ 
      public static double [][] smooth(double [][] input, int width, int height,
    				   int ks, double theta){
        Convolution convolution = new Convolution();
        double [][] gaussianKernel = new double [ks][ks];
        double [][] output = new double [width][height];
        gaussianKernel = gaussian2D(theta,ks);
        output = convolution.convolution2DPadded(input,width,height,
    					   gaussianKernel,ks,ks);
        return output;
      }
     
      /**
       * Takes an input image and a gaussian distribution, calculates
       * an appropriate kernel and applies a convolution to gaussian
       * smooth the image.
       *
       * @param input the input image array
       * @param w the width of the image
       * @param h the height of the image
       * @param ks the size of the kernel to be generated
       * @param theta the gaussian distribution
       * @return smoothed image array
       */
      public static int [] smooth_image(int [] input, int w, int h,
    				    int ks, double theta){
        double [][] input2D = new double [w][h];
        double [] output1D = new double [w*h];
        double [][] output2D = new double [w][h];
        int [] output = new int [w*h];
        //extract greys from input (1D array) and place in input2D
        for(int j=0;j<h;++j){
          for(int i=0;i<w;++i){
    	input2D[i][j] = (new Color(input[j*w+i])).getRed();
          }
        }
        //now smooth this new 2D array
        output2D = smooth(input2D,w,h,ks,theta);
     
        for(int j=0;j<h;++j){
          for(int i=0;i<w;++i){
    	output1D[j*w+i]=output2D[i][j];
          }
        }
        for(int i=0;i<output1D.length;++i){
          int grey = (int) Math.round(output1D[i]);
          if (grey > 255) { grey = 255;}
          if (grey < 0) { grey = 0;}
          //System.out.println(grey);
          output[i] = (new Color(grey,grey,grey)).getRGB();
        }
     
        return output;
      }
     
    }
    mais le problème est que je n'ai pas la classe Convolution citée dans le code

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    il suffit d'allouer un tableau de la taille du filtre souhaité et d'initialiser les valeurs en fonctions de la formule du noyau gaussien.
    Mais c'est mon jour de bonté : code source une nouvelle fois sur ImageJ.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Points : 41
    Points
    41
    Par défaut
    merci toto13 mais je ne t'ai pas compris; tu peux me réexpliquer,
    à propos de code de l'imgeJ; comment je peux intégrer ce code dans le programme? je dois ajouter des plugins ou quoi?

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    Citation Envoyé par inès83 Voir le message
    merci toto13 mais je ne t'ai pas compris; tu peux me réexpliquer,
    à propos de code de l'imgeJ; comment je peux intégrer ce code dans le programme? je dois ajouter des plugins ou quoi?
    Regarde les nombreux liens que te donne PseudoCode, il y a tout ce qu'il faut dedans pour calculer le noyau Gaussien et appliquer le filtre.
    Pour le code ImageJ, tu as le choix entre :
    - L'adapter à ton programme (format/classe d'image).
    - Recopier uniquement la partie de calcul du noyau dans ton programme et ensuite l'utiliser comme un simple masque de filtrage.
    - Installer le package ImageJ (conseillé si tu souhaites tout faire avec ImageJ).
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Points : 41
    Points
    41
    Par défaut
    Bonjour Pseudocode et Toto,
    je voudrais savoir s'il n'existe pas dans la bibliothèque jai une clase prédéfinie avec laquelle on peut appliquer un filtre gaussien parceque en matlab il existe une fonction de filtrage qu'on peut tout simplement appeler tout en déterminant le nom de filtrage et la taille du noyau
    Merci de répondre

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    Matlab est un "tout cohérent", c'est à dire que tout ce qui est fait en Matlab est pour MatLab.
    Là tu veux utiliser différents morceaux de codes simples mais dans différentes bibliothèques, architectures, ... Donc il faut les adapter.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par inès83 Voir le message
    Bonjour Pseudocode et Toto,
    je voudrais savoir s'il n'existe pas dans la bibliothèque jai une clase prédéfinie avec laquelle on peut appliquer un filtre gaussien parceque en matlab il existe une fonction de filtrage qu'on peut tout simplement appeler tout en déterminant le nom de filtrage et la taille du noyau
    Merci de répondre
    Pas besoin de JAI pour faire cela. Le package "java.awt.image" est suffisant:

    Les imports:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import java.awt.image.BufferedImage;
    import java.awt.image.ConvolveOp;
    import java.awt.image.Kernel;

    La construction du noyau
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public static Kernel gaussianKernel(int radius, double sigma) {
    	int size=(2*radius+1);
     
    	float[] filter = new float[size*size];
    	float sum =0;
     
    	for(int j=0;j<size;j++) {
    		for(int i=0;i<size;i++) {
    			int x = i-radius;
    			int y = j-radius;
    			float g = (float)Math.exp( -(x*x+y*y)/(2*sigma*sigma) );
    			filter[i+size*j]=g;
    			sum+=g;
    		}
    	}
     
    	for(int i=0;i<filter.length;i++) filter[i]/=sum; 
     
        return new Kernel(size, size, filter);
    }

    Le filtrage par convolution
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static BufferedImage filter(BufferedImage source, Kernel kernel){
    	ConvolveOp op = new ConvolveOp(kernel);
    	BufferedImage dest = new BufferedImage(source.getWidth(),source.getHeight(),source.getType());
    	return op.filter(source, dest);
    }

    Et un petit exemple d'utilisation:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BufferedImage input = ImageIO.read( new File("lena.bmp") );
    BufferedImage output = filter( input , gaussianKernel(7,2.5) );
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 69
    Points : 41
    Points
    41
    Par défaut
    Merci pseudocode,
    j'ai essayé le code et ça marche c'est vraiment très gentil de votre part

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par inès83 Voir le message
    Merci pseudocode,
    j'ai essayé le code et ça marche c'est vraiment très gentil de votre part
    Je ne suis plus à 3 lignes de Java près.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. appliqué le filtre gaussien sur un cvMat
    Par saidibillel dans le forum OpenCV
    Réponses: 1
    Dernier message: 12/06/2013, 18h15
  2. [Toutes versions] Appliquer le filtre actif sur un formulaire à une requête
    Par francoism27 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/01/2011, 01h18
  3. [CSS 2] appliquer un bandeau sur mon image de fond sur 2 Div
    Par Remus91 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 20/08/2009, 16h45
  4. Réponses: 3
    Dernier message: 14/04/2007, 22h30
  5. Retrouver le type de bruit influant sur mon image
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/10/2006, 19h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo