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 Bilineaire d'une image


Sujet :

2D Java

  1. #41
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Enfaite c'est plutot un prb de java il me faut juste comment dire que les valeurs de la premiere image se represente dans l'acte i de la grille et la 2eme l'acte j et le probleme sera resolu merci.
    Voilà le 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
    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
    package STAGE;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
     
    public class Histogrammebilineaire extends JPanel {
     
     
    		BufferedImage monImage;
    		BufferedImage monImage2;
     
    		public Histogrammebilineaire() {
     
    			File input = new File("d:/capture2.PNG");
    			File input2 = new File("d:/Capture.PNG"); 
    			try {
    				monImage = ImageIO.read(input);
    			} catch (IOException e) { 
    				e.printStackTrace();
    			}
    			try {
    				monImage2 = ImageIO.read(input2);
    			} catch (IOException e) { 
    				e.printStackTrace();
    			} 
    		}
     
    		public static void Fenetre() {
     
    			JFrame fenetre = new JFrame();
    			fenetre.setSize(273, 295);
    			fenetre.setTitle("Histogramme Bilinéaire");
    			JPanel panneau = new Histogrammebilineaire();
    			panneau.setBackground(Color.WHITE);
    			fenetre.add(panneau);
    			fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	                fenetre.setLocationRelativeTo(null);
    			fenetre.setVisible(true);
    		}
     
    		@Override
    		protected void paintComponent(Graphics g) {
     
     
    			super.paintComponent(g);
    			int larg = getWidth();
    			int haut = getHeight();
     
    			int dim = 8; // dimension d'une case de la grille
     
    			int largeurImage = Math.min(monImage.getWidth(), monImage2.getWidth());
    			int hauteurImage = Math.min(monImage.getHeight(), monImage2.getHeight());
    			for (int i = 0; i < largeurImage; i++) {
    				for (int j = 0; j < hauteurImage; j++) {
     
    					int pixel = monImage.getRGB(i, j);
    					int gray = ((pixel >> 16) & 0xFF) >> 3;
     
    					int pixel2 = monImage2.getRGB(i, j);
    					int gray2 = ((pixel2 >> 16) & 0xFF) >> 3;
     
    					//int valeur = (gray + gray2);
    					//g.setColor(new Color(valeur, valeur, valeur));
     
    							g.fillRect(i * dim, j * dim,dim, dim); // remplissage (fill)
     
    				}
    			}
     
    	                g.setColor(Color.WHITE); // donner une couleur à la grille, sinon ça prend la dernière couleur de l'histo
    	                for(int i = 0; i < larg; i +=dim) {
    	                     g.drawLine(i,0,i, haut); // Les lignes verticales de la grille
    	                }	
    	 		for(int i = 0; i < haut; i +=dim) {
    	                     g.drawLine(0,i,larg, i); // Les lignes horizontales de la grille
    	                }	
     
    		}
     
    		public static void main(String[] arg) {
    			Fenetre();
    		}
    	}
    Si vous pouvez me montrer comment exprimer ça ça sera super merci

  2. #42
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par YOUHANA Voir le message
    Enfaite c'est plutot un prb de java il me faut juste comment dire que les valeurs de la premiere image se represente dans l'acte i de la grille et la 2eme l'acte j et le probleme sera resolu merci.
    Les valeurs d'une image, c'est quoi ? Les valeurs RGB des couleurs des pixels d'une image, je comprends ce que c'est. Les valeurs HSL de ces couleurs, les dimensions, tout ça je comprends. La moyenne d'un ensemble de valeurs, je comprends ce que c'est. Mais les valeurs d'une image, non. Quant à déterminer la teinte majoritaire ou moyenne d'une image, ou sa saturation, ce n'est pas un problème de Java.
    Ensuite l'acte i d'une grille, c'est quoi ? Les actes d'une pièce de théatre, je sais ce que c'est, mais d'une grille, je ne vois pas.
    Dans une grille, il y a des cases. Elles ont chacune une abscisse et une ordonnée (des coordonnées). Quand tu sauras dire quelles coordonnées de case et quoi même dans la case (quelle information) et comment (commen représenter cette information), on pourra peut-être avancer. Peux-tu ne serait-ce que montrer l'affichage final à obtenir ?
    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. #43
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Le resultat final quand on a une image de deux couleurs c'est un histo comme ça que j'obtiens mais normalement je dois avoir que deux valeurs(deux cases) moi j'ai 4 et c'est ce que comprends pas.

    Nom : Capture.PNG
Affichages : 92
Taille : 15,5 Ko

    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
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
     
    public class Histogrammebilineaire extends JPanel {
     
     
    		BufferedImage monImage;
    		BufferedImage monImage2;
     
    		public Histogrammebilineaire() {
     
    			File input = new File("d:/capture2.PNG");
    			File input2 = new File("d:/Capture.PNG"); 
    			try {
    				monImage = ImageIO.read(input);
    			} catch (IOException e) { 
    				e.printStackTrace();
    			}
    			try {
    				monImage2 = ImageIO.read(input2);
    			} catch (IOException e) { 
    				e.printStackTrace();
    			} 
    		}
     
    		public static void Fenetre() {
     
    			JFrame fenetre = new JFrame();
    			fenetre.setSize(273, 295);
    			fenetre.setTitle("Histogramme Bilinéaire");
    			JPanel panneau = new Histogrammebilineaire();
    			panneau.setBackground(Color.WHITE);
    			fenetre.add(panneau);
    			fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	                fenetre.setLocationRelativeTo(null);
    			fenetre.setVisible(true);
    		}
     
    		@Override
    		protected void paintComponent(Graphics g) {
     
     
    			super.paintComponent(g);
    			int larg = getWidth();
    			int haut = getHeight();
     
    			int dim = 8; // dimension d'une case de la grille
     
    			//int largeurImage = Math.min(monImage.getWidth(), monImage2.getWidth());
    			//int hauteurImage = Math.min(monImage.getHeight(), monImage2.getHeight());
    			int largeurImage1=monImage.getWidth();
    			int hauteurImage1=monImage.getHeight();
    			int largeurImage2=monImage2.getWidth();
    			int hauteurImage2=monImage2.getHeight();
     
    			for (int i = 0; i < largeurImage1; i++) {
    				for (int j = 0; j < hauteurImage1; j++) {
     
    					int pixel = monImage.getRGB(i, j);
    					int gray = ((pixel >> 16) & 0xFF) >> 3;
    					for (i = 0; i < largeurImage2; i++) {
    						for (j = 0; j < hauteurImage2; j++) {
    					int pixel2 = monImage2.getRGB(i, j);
    					int gray2 = ((pixel2 >> 16) & 0xFF) >> 3;
     
    					//int valeur = (gray + gray2);
    					//g.setColor(new Color(valeur, valeur, valeur));
     
    							g.fillRect(gray2 * dim, gray * dim,dim, dim); // remplissage (fill)
     
    				}
    			}}}
     
    	                g.setColor(Color.WHITE); // donner une couleur à la grille, sinon ça prend la dernière couleur de l'histo
    	                for(int i = 0; i < larg; i +=dim) {
    	                     g.drawLine(i,0,i, haut); // Les lignes verticales de la grille
    	                }	
    	 		for(int i = 0; i < haut; i +=dim) {
    	                     g.drawLine(0,i,larg, i); // Les lignes horizontales de la grille
    	                }	
     
    		}
     
    		public static void main(String[] arg) {
    			Fenetre();
    		}
    	}

    Cordialement,

  4. #44
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je ne comprends pas pourquoi tu t'obstines à imbriquer 2 fois la boucle de parcours dans elle-même.

    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
    for (int i = 0; i < largeur; i++) {
    			for (int j = 0; j < hauteur; j++) {
    				int pixel = monImage.getRGB(i, j);
    				int gray = ((pixel >> 16) & 0xFF) >> 3;
     
    				int pixel2 = monImage2.getRGB(i, j);
    				int gray2 = ((pixel2 >> 16) & 0xFF) >> 3;
     
    				/*int valeur = (gray + gray2) << 2; // ça n'a plus aucun sens, à revoir (on veut le max de quoi ?)
     
    				if ( gray>max ) {
    					max=valeur;
    					imax=i;
    					jmax=j;
    				}*/ 
     
    				g.setColor(Color.BLACK); // couleur arbitraire mais probablement à évaluer avec les tests dont on avait parlé
     
    				g.fillRect(gray2 * largeurCase, gray * largeurCase, largeurCase, largeurCase); 
    			}
    		}
    Avec ce code, j'obtiens bien 2 points avec les 2 images que tu as fournies.
    Nom : Capture.PNG
Affichages : 88
Taille : 2,8 Ko

    Maintenant, je ne vois pas en quoi il s'agit d'un histogramme


    A noter, que j'ai juste remplacé la ligne de création d'image par matrice = new BufferedImage(largeurGrille, hauteurGrille, BufferedImage.TYPE_INT_ARGB);, pour avoir une image transparente, donc adaptable au background blanc du panel.
    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.

  5. #45
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Merci beaucoup

  6. #46
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    c'est encore moi je sais enfaite je suis vraiment désolé mais je suis vraiment coincée à chaque fois que je dis que c'est bon on me sort un truc que c'est pas ça le but, du coup on m'a précisé que l'histogramme "bilineaire" prend 2 images et fais l'histogramme de ses 2 dernières,
    à la position i,j on lit la donnée des 2 images. On crée une adresse correspondante aux 5 bits de poids forts de chaque image, donc la donnée (les 5 bits qu'on a prit) de l'image 1 est décalée à gauche de 5 bits et la donnée (les 5 bits de poids forts de l'image 2) sont positionnée dans les 5 bits de poids faible.

    C'est l'adresse d'un compteur. sur ce compteur on fait +1"


    Pour mieux vous expliquer la difference l'histogramme monolineaire que j'ai deja fait normalement on fait
    " A la position i,j on lit la donnée image cette donnée est l'adresse d'un compteur, sur ce compteur on fait +1"

  7. #47
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par YOUHANA Voir le message
    Bonjour,
    c'est encore moi je sais enfaite je suis vraiment désolé mais je suis vraiment coincée à chaque fois que je dis que c'est bon on me sort un truc que c'est pas ça le but,
    Ouais, mais bon, je ne vais pas passer tout l'été à faire et refaire 36 fois un truc.

    Citation Envoyé par YOUHANA Voir le message
    du coup on m'a précisé que l'histogramme "bilineaire" prend 2 images et fais l'histogramme de ses 2 dernières,
    à la position i,j on lit la donnée des 2 images.
    Quelle donnée ? La donnée d'une image ça n'existe pas (ou plutôt ça peut être tellement de choses, que c'est comme si ça n'existait pas). Sois précise ! Est-ce l'énoncé qu'on te donne ou c'est ta propre interprétation ? Si la donnée en question correspond à la couleur RGB du pixels de position i, j, dis-le en ces termes !
    Citation Envoyé par YOUHANA Voir le message
    On crée une adresse correspondante
    Une adresse ? Qu'est-ce que vient faire là une notion d'adresse ?
    Citation Envoyé par YOUHANA Voir le message
    aux 5 bits de poids forts de chaque image,
    Les 5 bits de la valeur RGB du pixel i,j, en fait, je suppose ? Encore un problème de précision. Si je n'ai pas d'information précise, je ne réponds plus : ça m'évitera de répondre un truc et que tu reviennes 2 jours après me dire qu'en fait ce n'est pas ça que tu dois faire.
    Citation Envoyé par YOUHANA Voir le message
    donc la donnée (les 5 bits qu'on a prit) de l'image 1 est décalée à gauche de 5 bits et la donnée (les 5 bits de poids forts de l'image 2) sont positionnée dans les 5 bits de poids faible.
    Donc on a une donnée sur 10 bits... à priori...
    Citation Envoyé par YOUHANA Voir le message
    C'est l'adresse d'un compteur. sur ce compteur on fait +1"
    L'adresse... oui je vois... rien à voir avec une adresse en fait (à moins qu'on programme en assembleur ou langage machine).

    Donc, traduis, tu dois parcourir l'ensemble de pixels de chaque image (qui doivent avoir la même taille forcément, ou alors il faut une règle (les min comme on a fait, ou considérer les valeurs RGB comme nulle pour les points de l'une qui sont en dehors de l'autre, ou autre règle quelconque que l'énoncé doit préciser). Pour chaque pixel, tu relève le RGB, et tu prends les 5 bits de poids fort (là il faut traduire : comme une BufferedImage à une couche alpha, et qu'en RGB, cette couche alpha vaut 255, il est totalement inutile de chercher à parcourir l'image, autant dire qu'il n'y a qu'une seule valeur (une adresse comme dit), qu'elle vaut 3FF, et on y met le nombre de points de l'image la plus petite, donc on parle de 5 bits de poids fort de la composant rouge d'une image). On combine les deux valeurs obtenues (si gray=((pixel >> 16) & 0xFF) >> 3 pour pixel = image1.getRGB(i,j) et gray2 idem pour image2, gray<<5 | gray2).

    • soit tu fais un tableau de 1024 valeurs, et tu incrémentes tableau[valeur]++
    • soit tu utilises cette valeur comme clef dans une Map<Integer, Integer> pour stocker le compteur, par exemple avec :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      Integer compteur = map.get( valeur );
      if ( compteur==null ) {
         map.put( valeur, 1);
      }
      else {
         map.put( valeur, compteur + 1);
      }
      Ou avec compute :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      map.compute( valeur, (v,compteur)-> compteur==null?1:compteur+1);


    Pour le reste, on a tout vu.
    Et c'est vraiment la dernière fois que je réponds si j'estime avoir à interpréter un seul mot de ta question.
    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.

  8. #48
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    Désolé c'etais vraiement que j'ai copié collé l'enoncé que j'avais, je suis vraiement navré du coup j'ai utilisé votre méthode de map dois je declarer la map (etant vraiment tres debutant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Map<Integer, Integer>;
    Map.compute( valeur, (v,compteur)-> compteur==null?1:compteur+1);
    et du coup pour chercher le max dans cette map peux je faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int max=0;
    if (valeur>max){
    	 			valeur=max;
    	 			}

  9. #49
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour déclarer la map, il faut déclarer une variable, de type Map, et instancier une HashMap (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Integer, Integer> map = new HashMap<>();
    Ensuite, tu utilises la variable map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.compute( valeur, (v,compteur)-> compteur==null?1:compteur+1 );
    Pour la remplir, c'est à ce niveau :

    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
     
    Map<Integer, Integer> map = new HashMap<>();
     
    for (int i = 0; i < largeur; i++) {
        for (int j = 0; j < hauteur; j++) {
    				int pixel = monImage.getRGB(i, j);
    				int gray = ((pixel >> 16) & 0xFF) >> 3;
     
    				int pixel2 = monImage2.getRGB(i, j);
    				int gray2 = ((pixel2 >> 16) & 0xFF) >> 3;
     
                                    int valeur = (gray<<5) | gray2; // met sur 1024 bits les 2 valeurs sur 5 bits
     
                                    map.compute( valeur, (v,compteur)-> compteur==null?1:compteur+1 ); 
     
        }
    }

    Ensuite, tu veux la valeur max de quoi ? Du compteur ou de la valeur sur 10 bits ?

    Pour lavoir la valeur 10 bits pour la valeur de compteur la plus grande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Map.Entry<Integer, Integer> max = map.entrySet().stream().max(Map.Entry.comparingByValue()).get();
     
    System.out.println("Valeur : " + max.getKey());
    System.out.println("Compteur : " + max.getValue());
    Pour avoir le compteur pour la valeur 10 bits la plus grande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Map.Entry<Integer, Integer> max = map.entrySet().stream().max(Map.Entry.comparingByKey()).get();
     
    System.out.println("Valeur : " + max.getKey());
    System.out.println("Compteur : " + max.getValue());
    Il faut bien entendu mettre ces lignes après les boucles (quand la map est complètement remplie).

    En revanche, je pense que du coup le dessin dans la grille doit être complètement changé. Mais en quoi ? Je ne vois toujours pas l'histoire d'avoir 2 points seulement et surtout je la vois encore moins avec ton dernier énoncé.
    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.

  10. #50
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Pour afficher toute les valeurs stocker dans la hashmap peut-on utiliser System.out.println("Position " +map.get(i)+ " i= " +i); ?

  11. #51
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Un System.out.println(map); suffit, mais le format sera imposé (du genre { clef1=valeur1, clef2=valeur2, clef3=valeur3 }. Mais pour voir rapidement ce qu'il y a dedans, çà suffit.
    Pour plus, il faut parcourir l'entrySet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for( Map.entry entry : map.entrySet() ) {
     
         System.out.println("Clef = " + entry.getKey() +" et Valeur = " + entry.getValue() );
     
    }
    Ou par stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     map.entrySet().forEach(entry-> System.out.println("Clef = " + entry.getKey() +" et Valeur = " + entry.getValue() ));
    Dans la map qu'on a constitué pour ton programme, la clef est la valeur sur 10 bits obtenue par les composantes des pixels des 2 images, et la valeur est le compteur (le nombre de fois que cette valeur est obtenue) .
    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.

  12. #52
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Merci beaucoup c'est exactement le résultat que je voulais et mon tuteur est très satisfait.
    Là du coup dans l'affichage de la grille ce que je devais faire des le debut c'est
    en ligne je fais la valeur de key/32 ( à chaque fois qu'il y'a un key dans la hashmap je le divise par / 32 et je colorie sa case)
    et pour les colonnes je fais un et logique entre la valeur de key et 31 et je colorie la case.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.fillRect(i * dim, j * dim,dim, dim);
    Pouvez vous m'indiquer avec quoi remplacer les i et j pour avoir celle ci ?

  13. #53
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par YOUHANA Voir le message
    Merci beaucoup c'est exactement le résultat que je voulais et mon tuteur est très satisfait.
    Là du coup dans l'affichage de la grille ce que je devais faire des le debut c'est
    en ligne je fais la valeur de key/32 ( à chaque fois qu'il y'a un key dans la hashmap je le divise par / 32 et je colorie sa case)
    et pour les colonnes je fais un et logique entre la valeur de key et 31 et je colorie la case.
    Donc, tu redécomposes la clef sur 10 bits en deux composantes, celles qui nous ont permises de composer cette clef sur 10 bits. On aurrait donc pu conserver ces deux valeurs et faire une classe pour représenter la clef.
    Mais bon, admettons :

    Donc, comme je te l'ai indiqué, pour parcourir les entrées de la map, il suffit de faire :
    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
    for(Map.Entry entry : map.entrySet()) {
     
          int valeur = entry.getValeur();
     
          // ici tu fais ton test sur valeur pour déterminer la couleur à passer dans g.setColor( couleur )
     
     
          int key = entry.getKey(); 
     
          int i = key / 32; 
     
          int j = key & 31;
     
          g.fillRect(i * dim, j * dim,dim, dim);
     
     
     
    }
    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.

  14. #54
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    j'ai valeurc qui est egale à 31 donc la couleur doit être cyan du coup je l'ai ici en bleu ! voilà mon 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
       for(Map.Entry entry : map.entrySet()) {
     
    		                                     valeur = (int) entry.getValue();
     
    		                                     if (valeur>max)
    			                            	   max=valeur;
     
    		                               int valeurc=(valeur/max)*100;
     
    		                            Color color = Color.black; 
     
    		                            if ( valeurc >= 90 ) { 
    		              				  color = Color.RED;
    		              				} else if ( valeurc >= 80 ) { 
    		              		          color = Color.ORANGE;
    		              		        }
    		              				else if ( valeurc >= 70 ) { 
    		              			          color = Color.YELLOW; 
    		              			          }
    		              				else if ( valeurc >= 40 ) { 
    		              			          color = Color.GREEN; 
    		              			          }
    		              				else if ( valeurc >= 20 ) { 
    		              			          color = Color.CYAN; 
    		              			          }
    		              				else if ( valeurc >= 0 ) { 
    		              			          color = Color.BLUE; 
    		              			          }
     
    		              					g.setColor( color );

  15. #55
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Attention, en Java, si tu divises 2 entiers, ça donne un entier. Si le diviseur est supérieur au dividende, ça donnera toujours 0.
    Dans valeur/max, max est forcément plus grand ou égal que valeur (c'est le max), donc sauf quand valeur vaut max, ça vaut toujours 0.
    Il faut convertir en float ou double pour avoir une division exacte, puis reconvertir en int : (int)(((double)valeur)/max).

    En revanche, ton code est étrange : tu es sure de devoir déterminer le max au fur et à mesure ? En théorie, il faudrait faire une première boucle pour déterminer le max, puis une seconde pour les couleurs. Ou utiliser le code que je t'ai montré pour calculer le max.
    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.

  16. #56
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    J'ai bien entendu essayé votre methode mais du coup les valeurs sont toutes noirs je crois c'est un prblm de boucle ?

  17. #57
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je te l'ai déjà dit : la boucle sur la map doit être faite quand la map est remplie donc quand la double boucle qui la remplit est terminée, donc après cette double-boucle. Et non pas dedans. Il faut faire les choses dans l'ordre et au moment opportun.
    C'est comme si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int n=0;
    for(int i=0; i<5; i++) {
        n  = n + i;
        System.out.println( n );
    }
    ça va afficher
    0
    1
    3
    6
    10
    
    Pour afficher 10, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int n=0;
    for(int i=0; i<5; i++) {
        n  = n + i;
    }
    System.out.println( n );
    On calcule quelque chose dans la boucle, et on utilise le résultat après la boucle, en dehors de la boucle, quand la boucle est terminée !

    De la même façon, si tu dessines des points, et qu'ensuite tu dis que la couleur est bleue, vert, orange ou ce que tu veux, ça ne changera rien de rien aux points déjà dessinés. On affecte la couleur, et ensuite on dessine dans cette couleur.

    Comme ça (tu remarqueras que j'ai passé le max en double, ce qui simplifie ensuite le calcul de valeurc, au lieu de diviser un double par un int, ou divise un int par un double) :
    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
    Map<Integer, Integer> map = new HashMap<>();
     
    int largeurImage;
    int hauteurImage;
     
    // on analyse d'abord les pixels de l'image pour avoir le compte de pixels
    for (int i = 0; i < largeurImage; i++) {
     
    for (int j = 0; j < hauteurImage; j++) {
     
       int pixel = monImage.getRGB(i, j);
       int gray = ((pixel >> 16) & 0xFF) >> 3;
     
       int pixel2 = monImage2.getRGB(i, j);
       int gray2 = ((pixel2 >> 16) & 0xFF) >> 3;
     
       int valeur = (gray2 << 5) | gray;
     
       map.compute(valeur, (v, compteur) -> compteur == null ? 1 : compteur + 1);
     
       }
    }
     
    // on détermine la valeur max
    double max = map.entrySet().stream().max(Map.Entry.comparingByValue()).get().getValue();
     
    // on parcourt les points pour les afficher
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        int valeur = entry.getValue();
        int key = entry.getKey();
     
        int i = key / 32;
        int j = key & 31;
     
        int valeurc = (int) ((valeur / max) * 100);
     
        Color color = Color.black;
     
        if (valeurc >= 90) {
           color = Color.RED; 
        } else if (valeurc >= 80) {
           color = Color.ORANGE;
        } else if (valeurc >= 70) {
           color = Color.YELLOW;
        } else if (valeurc >= 40) {
           color = Color.GREEN;
        } else if (valeurc >= 20) {
           color = Color.CYAN;
        } else if (valeurc >= 0) {
           color = Color.BLUE;
        }
        g.setColor(color);
     
        g.fillRect(i * dim, j * dim, dim, dim);
     
    }
    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.

  18. #58
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    peut -on dessiner un axe de 0 à 31 horizontalement dans une grille ?

  19. #59
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui. Avec Graphics.drawLine(x1,y1,x2,y2) tu peux dessiner des lignes.
    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.

  20. #60
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Oui ça je suis d'accord , mais peut-on les numeroter ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. [2D/3D] [OpenGL] Histogramme 3D d'une image
    Par 686insomnia686 dans le forum Qt
    Réponses: 9
    Dernier message: 08/10/2013, 23h26
  2. [Débutant] histogramme logarithmique d'une image
    Par amal1410 dans le forum Images
    Réponses: 1
    Dernier message: 16/05/2013, 20h24
  3. histogramme vertical d'une image
    Par matrix2008 dans le forum Images
    Réponses: 5
    Dernier message: 13/12/2012, 10h49
  4. histogramme cumulé d'une image
    Par arsonlupo dans le forum Images
    Réponses: 1
    Dernier message: 02/06/2009, 20h01
  5. Réponses: 3
    Dernier message: 27/01/2005, 10h53

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