Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 69
    Points : 11
    Points
    11

    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 Guillaume
    Ingénieur de Recherche
    Inscrit en
    janvier 2006
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Santé

    Informations forums :
    Inscription : janvier 2006
    Messages : 5 219
    Points : 8 739
    Points
    8 739

    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
    Candidat au titre de Membre du Club
    Inscrit en
    novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 69
    Points : 11
    Points
    11

    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 :
    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 Guillaume
    Ingénieur de Recherche
    Inscrit en
    janvier 2006
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Santé

    Informations forums :
    Inscription : janvier 2006
    Messages : 5 219
    Points : 8 739
    Points
    8 739

    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
    Candidat au titre de Membre du Club
    Inscrit en
    novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 69
    Points : 11
    Points
    11

    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/Modérateur
    Avatar de pseudocode
    Homme Profil pro Xavier Philippeau
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    9 960
    Détails du profil
    Informations personnelles :
    Nom : Homme Xavier Philippeau
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 9 960
    Points : 15 759
    Points
    15 759
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro Guillaume
    Ingénieur de Recherche
    Inscrit en
    janvier 2006
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Santé

    Informations forums :
    Inscription : janvier 2006
    Messages : 5 219
    Points : 8 739
    Points
    8 739

    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
    Candidat au titre de Membre du Club
    Inscrit en
    novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 69
    Points : 11
    Points
    11

    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 Guillaume
    Ingénieur de Recherche
    Inscrit en
    janvier 2006
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Santé

    Informations forums :
    Inscription : janvier 2006
    Messages : 5 219
    Points : 8 739
    Points
    8 739

    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/Modérateur
    Avatar de pseudocode
    Homme Profil pro Xavier Philippeau
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    9 960
    Détails du profil
    Informations personnelles :
    Nom : Homme Xavier Philippeau
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 9 960
    Points : 15 759
    Points
    15 759

    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 :
    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 :
    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 :
    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 :
    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
    Candidat au titre de Membre du Club
    Inscrit en
    novembre 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 69
    Points : 11
    Points
    11

    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/Modérateur
    Avatar de pseudocode
    Homme Profil pro Xavier Philippeau
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    9 960
    Détails du profil
    Informations personnelles :
    Nom : Homme Xavier Philippeau
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : décembre 2006
    Messages : 9 960
    Points : 15 759
    Points
    15 759

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •