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

2D Java Discussion :

Histogramme d'une image


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Par défaut Histogramme d'une image
    Bonjour,

    je dessine un histogramme d'une image en utilisant ce code

    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
    public class Histogramme extends JComponent {
     
       private static final long serialVersionUID = 1L;
       private BufferedImage image, histogramme;
       private final int largeur = 256;
       private final int hauteur = 200;
       private Graphics2D dessin;
       private final int[] rouge = new int[256];
       private final int[] vert = new int[256];
       private final int[] bleu = new int[256];
     
       public Histogramme(BufferedImage monImage){
          image = monImage;
          récupérerRVB();
          tracerHistogrammes();
       }
     
       protected void paintComponent(Graphics surface) {
         // surface.drawImage(image, 0, 0, null);  
          surface.drawImage(histogramme,100, 100, null);
       }
     
       private void récupérerRVB() {
          Raster trame = image.getRaster();
          int[] rgb = new int[3];
          int maximum = 0;
          for (int y=0; y<image.getHeight(); y++)
             for (int x=0; x<image.getWidth(); x++) {
                trame.getPixel(x, y, rgb);
                rouge[rgb[0]]++;
                vert[rgb[1]]++;
                bleu[rgb[2]]++;
             }          
       }
     
       private void tracerHistogrammes() {
          histogramme = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
          dessin = histogramme.createGraphics();
          Rectangle2D rectangle = new Rectangle2D.Double(0, 0, largeur-1, hauteur-1);
          dessin.draw(rectangle);
          dessin.setPaint(new Color(1F, 1F, 1F, 0.2F));
          dessin.fill(rectangle);     
          changerAxes();
          dessin.setPaint(new Color(1F, 0F, 0F, 0.4F));
          tracerHistogramme(rouge);
          dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
          tracerHistogramme(vert);
          dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
          tracerHistogramme(bleu);
       }
     
       private void changerAxes() {
          dessin.translate(0, hauteur);
          double surfaceImage = image.getWidth()*image.getHeight();
          double surfaceHistogramme = histogramme.getWidth()*histogramme.getHeight();
          dessin.scale(1, -surfaceHistogramme/surfaceImage/3.7);     
       }  
     
       private void tracerHistogramme(int[] couleur) {
          for (int i=0; i<255; i++)
             dessin.drawLine(i, 0, i, couleur[i]);             
       }

    Ma question est je veux afficher les valeurs de celui ci, genre le max le zero le 255 !! Et j'en ai aucune idée

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si c'est comment écrire des caractères que tu voudrais savoir, il suffit d'utiliser la méthode drawString() de la classe Graphics.

    Par exemple : dessin.drawString(String.valueOf(max), x, y); (attention, y est l'ordonnée de la base line). En revanche, comme tu changes la transformée affine de ton contexte graphique, il faudra restituer l'identité (dessin.setTransform(new AffineTransform());) sinon tu vas écrire à l'envers, sans parler de la déformation.

    Par ailleurs, pense à toujours libérer un contexte graphique après avoir dessiner dedans, en appelant dispose() : dessin.dispose(); à la fin de ta méthode traceHistogrammes().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Par défaut
    Bonjour,
    comme je suis débutant j'ai pas bien compris enfaite par exemple pour ajouter les valeurs de 0 à 255 je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dessin.drawString(String.valueOf(255), x, y);
    Je remplace x et y par quoi ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    X et Y sont les coordonées ou la méthode va dessiner le texte tout simplement. (Il suffit d'aller voir la doc de la méthode...)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Par défaut
    Bonjour,
    Je sais que le forum est un peu ancien mais je reviens vers vous pour un nv problème.
    Apres avoir dessiner l'histogramme j'utilise un jslider enfaite je fais en sorte qu'il dessine pas l'histogramme si les valeurs sont inferieurs aux valeurs du slider
    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
     private void tracerHistogramme(int[] couleur) {
     
         // String selected = "none";
     
      	 javax.swing.event.ChangeEvent e = null;
      	  for (int i=0; i<255; i++) {
      		for (int j=0; j<255; j++) {	
      		int value = ((javax.swing.JSlider)(e.getSource())).getValue();
      		int rgb = image.getRGB(i,j);
      		if((rgb&0xff) < value){
     
     
      			dessin.drawLine(0, 0, 0, 0); }
      		else if ((rgb&0xff) > value){
      		dessin.drawLine(i, 0, i, couleur[i]);  
      			}
     
      		}
    mais j'ai une erreur qui est nullpointer, je sais que mon e=null mais je sais pas quoi faire du coup Pouvez vous m'aider svp

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Comme tous les composants Swing de type interactif, un JSlider est évenementiel : on enregistre un écouteur qui va écouter les évenements et réagir au moment où l'évenement sera reçu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    jslider.addChangeListener(new ChangeListener() {
     
    public void stateChanged(ChangeEvent e) {
        JSlider source = (JSlider)e.getSource();
        if (!source.getValueIsAdjusting()) {
            int value = (int)source.getValue();
            // ici on appelle la méthode qui provoque le (re)dessin de l'histogramme
        }
    }
     
    });
    Par exemple, avec le code initial (que j'ai corrigé par ailleurs) que tu as indiqué (parce que le dernier me semble douteux, avec cette boucle sur les pixels d'une image...)


    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
    public class Histogramme extends JComponent {
     
       private static final long serialVersionUID = 1L;
       private BufferedImage image, histogramme;
       private final int largeur = 256;
       private final int hauteur = 200;
       private final int[] rouge = new int[256];
       private final int[] vert = new int[256];
       private final int[] bleu = new int[256];
     
       private int minBleu; // la valeur de seuil pour le bleu
       private int minRouge; // la valeur de seuil pour le rouge
       private int minVert; // la valeur de seuil pour le vert
     
       public Histogramme(BufferedImage monImage){
          image = monImage;
          récupérerRVB();
          tracerHistogrammes();
       }
     
       public void setMinBleu(int minBleu) {
              this.minBleu=minBleu;
              repaint(); // provoque un redessin
       }
     
       public void setMinRouge(int minRouge) {
              this.minRouge=minRouge;
              repaint(); // provoque un redessin
       }
     
       public void setMinVert(int minVert) {
              this.minVert=minVert;
              repaint(); // provoque un redessin
       }
     
       protected void paintComponent(Graphics surface) {
         // surface.drawImage(image, 0, 0, null);  
          surface.drawImage(histogramme,100, 100, null);
       }
     
       private void récupérerRVB() {
          Raster trame = image.getRaster();
          int[] rgb = new int[3];
          int maximum = 0;
          for (int y=0; y<image.getHeight(); y++)
             for (int x=0; x<image.getWidth(); x++) {
                trame.getPixel(x, y, rgb);
                rouge[rgb[0]]++;
                vert[rgb[1]]++;
                bleu[rgb[2]]++;
             }          
       }
     
       private void tracerHistogrammes() {
          histogramme = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
          Graphics2D dessin = histogramme.createGraphics();
          Rectangle2D rectangle = new Rectangle2D.Double(0, 0, largeur-1, hauteur-1);
          // ne sert strictement à rien dessin.draw(rectangle);
          dessin.setPaint(new Color(1F, 1F, 1F, 0.2F));
          dessin.fill(rectangle);     
          changerAxes(dessin);
          dessin.setPaint(new Color(1F, 0F, 0F, 0.4F));
          tracerHistogramme(dessin, rouge, minRouge);
          dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
          tracerHistogramme(dessin, vert, minVert);
          dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
          tracerHistogramme(dessin, bleu, minBleu);
          dessin.dispose(); // toujours disposer après utilisation
       }
     
       private void changerAxes(Graphics2D dessin) {
          dessin.translate(0, hauteur);
          double surfaceImage = image.getWidth()*image.getHeight();
          double surfaceHistogramme = histogramme.getWidth()*histogramme.getHeight();
          dessin.scale(1, -surfaceHistogramme/surfaceImage/3.7);     
       }  
     
       private void tracerHistogramme(Graphics2D dessin, int[] couleur, int min) {
          for (int i=0; i<255; i++)
             if ( couleur[i]>min ) { // par exemple (je ne sais pas en quoi la valeur du slider est censée intervenir dans ton dessin, mais ça ressemble à ça dans ton dernier code)
                dessin.drawLine(i, 0, i, couleur[i]);             
             }
     
          }
       }
    Ensuite dans le prog principal, tu as
    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
    public static void main(Strng[] args) {
     
         /*...*/
     
         Histogramme histo = new Histogramme( image ) ;
     
         JSlider sliderRouge = new JSlider(...);
         JSlider sliderVert = new JSlider(...);
         JSlider sliderBleu = new JSlider(...);
     
         sliderBleu.addChangeListener(new ChangeListener() {
                 JSlider source = (JSlider)e.getSource();
                 if (!source.getValueIsAdjusting()) {
                    int value = (int)source.getValue();
                    histo.setMinBleu(value);
                }
         });
         sliderVert .addChangeListener(new ChangeListener() {
                 JSlider source = (JSlider)e.getSource();
                 if (!source.getValueIsAdjusting()) {
                    int value = (int)source.getValue();
                    histo.setMinVert(value);
                }
         });
         sliderRouge.... pareil...
     
         /*...*/
    }
    ou plus simple avec les lambdas en java 8 :
    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
    public static void main(Strng[] args) {
     
         /*...*/
     
         Histogramme histo = new Histogramme( image ) ;
     
         JSlider sliderRouge = new JSlider(...);
         JSlider sliderVert = new JSlider(...);
         JSlider sliderBleu = new JSlider(...);
     
         sliderBleu.addChangeListener(e-> histo.setMinBleu(sliderBleu.getValue());
         sliderVert.addChangeListener(e-> histo.setMinVert(sliderVert.getValue());
         sliderRouge.addChangeListener(e-> histo.setMinRouge(sliderRouge.getValue());
     
         /*...*/
    }
    }



    On peut fonctionner en mode non évenementiel en récupérant la valeur directement jslider.getValue() mais bien sûr cela ne fonctionnera que si le silder est affiché, et que l'utilisateur le bouge, avant l'histogramme, et tout changement dans le slider ensuite n'aura aucun effet.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Egalisation de histogramme pour une image
    Par mihaispr dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 19/03/2009, 09h58
  2. problème d'affichage de l'histogramme d'une image
    Par tuunisiano dans le forum Simulink
    Réponses: 0
    Dernier message: 18/03/2009, 15h12
  3. Génération de l'histogramme d'une image
    Par Jrihab dans le forum Graphisme
    Réponses: 1
    Dernier message: 14/12/2008, 19h27
  4. Histogramme d'une image BMP en niveaux de gris?
    Par bahiatoon dans le forum C++Builder
    Réponses: 13
    Dernier message: 19/11/2008, 16h36
  5. histogramme d'une image coloré
    Par kachaloarmin dans le forum Imagerie
    Réponses: 1
    Dernier message: 13/11/2007, 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