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 :

Calculer la médiane d'un ensemble


Sujet :

2D Java

  1. #1
    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 Calculer la médiane d'un ensemble
    Bonjour,
    J'ai comme mission de calculer la medianne en utilisant cet algo :
    Nbpts connu (somme dans mon code)
    Tableau 256 valeur histo connu
    Parcourir le tableau à partir du 0 jusqu'à somme des contenus>Nbpts/2
    Sortie medianne=pointeur

    Exemple:
    somme=0
    pointeur=0
    lecture contenu de pointeur
    addition somme=somme+contenu
    test somme>Nbpts/2
    Si oui sortie sinon ==> mediane=pointeur
    incr pointeur
    saut

    Voila mon code j'ai un resultat qui est appparemment "FAUX" et que j'ai essayer avec tous moyens de corriger sans resultat, pouvez vous verifier SVP ?
    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
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
     
     
     
    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
    	   private int maxRouge=0;
    	   private int maxVert=0;
    	   private int maxBleu=0;
    	   private int sumRouge=0;
    	   private int sumVert=0;
    	   private int sumBleu=0;
    	   private int medianeRouge=0;
    	   private int medianeVert=0;
    	   private int medianeBleu=0;
    	    static int sum=0;
    	    static int max =0;
    	    static int position;
    	    static int med;
    	   public Histogramme(BufferedImage monImage){
    		      image = monImage;
    		      recupererRVB();
    	              maxRouge = max(rouge);
    	              maxVert = max(vert);
    	              maxBleu = max(bleu);
    	              sumRouge = sum(rouge);
    	              sumVert = sum(vert);
    	              sumBleu = sum(bleu);
    	              medianeRouge = medianne(rouge);
    	              medianeVert = medianne(vert);
    	              medianeBleu = medianne(bleu);
    		      tracerHistogrammes();
    		   }
     
    	   public void setMax(int max) {
    		this.max=max;
    	}
    	   public void Setsum(int sum) {
    			this.sum=sum;
    		}
    	   public void Setmed(int med) {
    			this.med=med;
    		}
    	   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);
    	   }
     
    		   public int[] toArray(int argb) {
     
    			   int[] array = new int[3];
     
    			   array[0] = (argb >> 16 ) & 0xff;
    			   array[1] = (argb >> 8 ) & 0xff;
    			   array[2] = (argb) & 0xff;
     
    			   return array;
    	         } 
    		   private void recupererRVB() { 
    			      int maximum = 0;
    			      for (int y=0; y<image.getHeight(); y++)
    			         for (int x=0; x<image.getWidth(); x++) {
    			            int[] rgb = toArray(image.getRGB(x, y));
    			            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);
    	      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, maxRouge, sumRouge, medianeRouge);
    	      dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
    	      tracerHistogramme(dessin, vert, minVert,maxVert,sumVert,medianeVert);
    	      dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
    	      tracerHistogramme(dessin, bleu, minBleu,maxBleu,sumBleu,medianeBleu);
     
     
    	      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 int max(int[] array) {
    		     int max=0;
    		     for(int i : array) {
    		         max = Math.max(i,max);
    		     }
    		     return max;
    		}
     
    	   private int sum(int[] array) {
    		     int somme=0;
    		     for(int i : array) {
    		         somme += i ;
    		         }
    		     return somme;
    		}
     
    	   private int medianne(int[] array) {
    		   Boolean test=false;
    		   int val = 0;
    		   int mediane=0;
    		   for(int i=0;i<255;i++) {
    		   	mediane += i ;
    		   if(mediane>sum/2 && test!=true){
    		   		  val=i;
    		                test=true;
    		   }
    		   		}
    		   return val ;
    		   }
     
     
    	   private void tracerHistogramme(Graphics2D dessin, int[] couleur, int min , int max, int somme, int mediane) {
     
    		   for (int i=0; i<couleur.length; i++)
    		         if ( couleur[i]>min ) { 
    		            dessin.drawLine(i, 0, i, couleur[i]); 
     
    		         if ( couleur[i]==max ) {
    		        	    position=i;
    		         }
    	         }
     
     
    		   boolean dejaAffiche=false;
     
    		   for(int i=0;i<couleur.length; i++){
     
    		       if ( couleur[i]<=max/2 && !dejaAffiche ) {
    		            System.out.println("Born A "  +i);
    		            dejaAffiche=true;
    		       }
    		       if ( couleur[i]==max ) {
    		    	   System.out.println("Born B "  +i);
    		            dejaAffiche=false; // on veut afficher la première valeur de i tel que couleur[i]<= max/2 après max
    		       }
     
    		   }
     
    		   setMax(max);
    		   Setsum(somme); 
    		   Setmed(mediane);
    	      }
    	   }

  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 : 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
    Salut,

    Déjà, je t'ai déjà dit qu'il fallait faire for(int i=0;i<array.length;i++) {, et pas for(int i=0;i<255;i++) {, parce que ton tableau contient 256 valeurs, pas 255 !

    Ensuite, dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for(int i=0;i<255;i++) {
    		   	mediane += i ;
    		   if(mediane>sum/2 && test!=true){
    		   		  val=i;
    		                test=true;
    		   }
    		   		}
    Tu fais la somme des positions dans le tableau, alors qu'il faut faire la somme des valeurs à ces positions...

    Ensuite, au lieu d'utiliser un booléen pour éviter de calculer plusieurs fois val, tu peux simplement faire un break.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private int medianne(int[] array) {
       int val = 0;
       int mediane=0;
       for(int i=0; i<array.length; i++) {
           mediane += array[i];
           if(mediane>sum/2 ){
    	     val=i;
                 break;
           }
       }
       return val ;
    }
    Par ailleurs, utilise plutôt le type boolean dans ce genre de cas, pas Boolean (ce n'est pas la même chose, le premier est primitif, le second objet), pour des raisons de performances (temps et mémoire).

    A noter, qu'en toute logique, val devrait être initialisée à autre chose qu'une valeur posible de positions (-1 par exemple), même si effectivement on sait qu'on ne traitera jamais de tableau vide dans ton cas particulier.
    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 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,
    Merci pour votre retour, j'ai corriger ma faute et j'ai essayer d'afficher le tableau en parallèle avec le calcul de la médiane
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(array[i]);
    mais du coup j'ai plus que 255 valeur !! Presque 800 valeur alors qu'il doit contenir que 256 valeur pouvez vous m'expliquer svp ?

  4. #4
    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
    Et bien, probablement parce que tu appelles ta méthode médiane trois fois, une fois pour le rouge, une fois pour le vert et une fois pour le rouge. 256 (et pas 255, nom de nom) * 3 = 768, pas loin de 800 en 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.

  5. #5
    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
    Ah d'accord merci beaucoup, y'a t'il un moyen pour l'appeller une seul fois pour les 3 valeurs et obtenir que 256 valeurs ? Sinon le calcul de la mediane sera faux !

  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 : 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
    Bah, tu dois calculer la médiane du rouge, celle du vert et celle du bleu. Je vois mal comment tu pourrais. Ou alors tu ne dois pas calculer la médiane de chaque "couleur". Comme tu n'affiches que le rouge, les deux autres étant invisibles (puisqu'affiché en alpha=0, comme je te l'ai déjà dit), peut-être que le but de ton composant est ne traiter qu'une seule des trois couleurs, le rouge donc. Dans ce cas, ne traite que le rouge, et n'appelle pas, donc les méthodes pour les autres (ne stocke même pas le vert et le bleu, ne le dessine pas même en invisible, etc.).

    Au passage, tu calcules trois médianes différentes, chacune sur 256 valeurs, et donc, chacune d'entre-elles n'est pas fausse.
    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.

  7. #7
    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 je passe en résolu

  8. #8
    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,

    Pour calculer la medianne faut que la valeur de "sum" se calcule en premier. C'est ce que j'ai fais mais c'est pas ce le résultat attendu que j'obtiens ? Puis autre question en executant deux fois l'histogramme de mon interface j'ai une erreur de parametre outside .. Dans mediane , comment peux je remettre la valeur de la sum et medianne à zero apres avoir afficher ses dernières.

    Cordialement,
    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
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
     
     
    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
    	   private int maxRouge=0;
    	   private int maxVert=0;
    	   private int maxBleu=0;
    	   private int sumRouge=0;
    	   private int sumVert=0;
    	   private int sumBleu=0;
    	   private int medianeRouge=0;
    	   private int medianeVert=0;
    	   private int medianeBleu=0;
    	    static int sum;
    	    static int max;
    	    static int position;
    	    static int med;
    	   public Histogramme(BufferedImage monImage){
    		      image = monImage;
    		      recupererRVB();
    	              maxRouge = max(rouge);
    	              maxVert = max(vert);
    	              maxBleu = max(bleu);
    	              sumRouge = sum(rouge);
    	              sumVert = sum(vert);
    	              sumBleu = sum(bleu);
    	              medianeRouge = medianne(rouge);
    	              medianeVert = medianne(vert);
    	              medianeBleu = medianne(bleu);
    		      tracerHistogrammes();
    		   }
     
    	   public void setMax(int max) {
    		this.max=max;
    	}
    	   public void Setsum(int sum) {
    			this.sum=sum;
    		}
    	   public void Setmed(int med) {
    			this.med=med;
    		}
    	   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);
    	   }
     
    		   public int[] toArray(int argb) {
     
    			   int[] array = new int[3];
     
    			   array[0] = (argb >> 16 ) & 0xff;
    			   array[1] = (argb >> 8 ) & 0xff;
    			   array[2] = (argb) & 0xff;
     
    			   return array;
    	         } 
    		   private void recupererRVB() { 
    			      int maximum = 0;
    			      for (int y=0; y<image.getHeight(); y++)
    			         for (int x=0; x<image.getWidth(); x++) {
    			            int[] rgb = toArray(image.getRGB(x, y));
    			            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, hauteur);
    	      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, maxRouge, sumRouge, medianeRouge);
    	      dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
    	      tracerHistogramme(dessin, vert, minVert,maxVert,sumVert,medianeVert);
    	      dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
    	      tracerHistogramme(dessin, bleu, minBleu,maxBleu,sumBleu,medianeBleu);
     
     
    	      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 int max(int[] array) {
    		     int max=0;
    		     for(int i : array) {
    		         max = Math.max(i,max);
    		     }
    		     return max;
    		}
     
    	   private int sum(int[] array) {
    		     int somme=0;
    		     for(int i : array) {
    		         somme += i ;
    		         }
    		     return somme;
    		}
     
    	   private int medianne(int[] array) {
    		   int val = -1;
    		   int mediane=0;
    		   for(int i : array) {
    		       mediane += array[i];
    		       if(mediane>sum/2 ){
    			     val=i;
    		             break;
    		       }
    		   }
    		   return val ;
    		}
     
     
     
    	   private void tracerHistogramme(Graphics2D dessin, int[] couleur, int min , int max, int somme, int mediane) {
     
    		   for (int i=0; i<couleur.length; i++){
    			   System.out.println(couleur[i]);
    		         if ( couleur[i]>min ) { 
    		            dessin.drawLine(i, 0, i, couleur[i]); 
     
    		         if ( couleur[i]==max ) {
    		        	    position=i;
    		         }
    	         }}
     
     
    		   boolean dejaAffiche=false;
     
    		   for(int i=0;i<couleur.length; i++){
     
    		       if ( couleur[i]<=max/2 && !dejaAffiche ) {
    		            //System.out.println("Born A "  +i);
    		            dejaAffiche=true;
    		       }
    		       if ( couleur[i]==max ) {
    		    	   //System.out.println("Born B "  +i);
    		            dejaAffiche=false; // on veut afficher la première valeur de i tel que couleur[i]<= max/2 après max
    		       }
     
    		   }
     
    		   setMax(max);
    		   Setsum(somme); 
    		   Setmed(mediane);
    	      }
    	   }

  9. #9
    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, parce que pour calculer la mediane des rouges il faut utiliser la somme des rouges, pour la médiane des verts, la somme des verts, et pour celle des bleus, la somme des bleus. Là, toi, tu utilises une variable (sum) qui est toujours 0.
    Il faudrait passer la somme en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private int medianne(int[] array, int sum) {
    		   int val = -1;
    		   int mediane=0;
    		   for(int i : array) {
    		       mediane += array[i];
    		       if(mediane>sum/2 ){
    			     val=i;
    		             break;
    		       }
    		   }
    		   return val ;
    		}
    Et l'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sumRouge = sum(rouge);
    sumVert = sum(vert);
    sumBleu = sum(bleu);
    medianeRouge = medianne(rouge,sumRouge);
    medianeVert = medianne(vert,sumVert);
    medianeBleu = medianne(bleu, sumBleu);
    Citation Envoyé par YOUHANA Voir le message
    j'ai une erreur de parametre outside
    C'est-à-dire ? C'est quoi le message d'erreur exactement ? La stacktrace ?

    Citation Envoyé par YOUHANA Voir le message
    .. Dans mediane , comment peux je remettre la valeur de la sum et medianne à zero apres avoir afficher ses dernières.
    Dans mediane ? Dans la méthode mediane() ? Remettre à zéro la sum et la médianne ? Pour quoi faire ? En plus, l'affichage se passant ailleurs, et de manière asynchrone, ça n'a aucun sens : si tu remettais ces valeurs à 0, à partir du deuxième affichage, la donnée serait à 0, et l'affichage donc faux. Cela n'a aucun intérêt de faire ça par ailleurs. En revanche, il sera probablement utile de tout recalculer lorsqu'on appelle l'une des méthodes setMin().
    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. #10
    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 pour ton explication. Voilà l'erreur

    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
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 493
    	at STAGE.Histogramme.medianne(Histogramme.java:154)
    	at STAGE.Histogramme.<init>(Histogramme.java:49)
    	at STAGE.PanelImage.afficheHistograme(PanelImage.java:861)
    	at STAGE.Acceuil$2.actionPerformed(Acceuil.java:173)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.AbstractButton.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$500(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    C'est dans cette ligne de code

  11. #11
    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
    Ah, c'est parce que à la place de for(int i : array) { dans mediane(), il faut for(int i=0; i<array.length; i++). Sinon, on parcourt la liste des valeurs du tableau et on s'en sert comme position. Je n'avais pas vu que tu avais modifié ça quand j'ai fait le copier/coller de ton code... Pourquoi l'avoir modifié d'ailleurs ?
    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. #12
    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, dernière question peut on faire la même chose (calcule de mediane) en allant d'une matrice (histogramme bilineaire) et avoir deux valeurs de mediane ? Une pour le calcul vertical et l'autre pour l'horizontal ?

  13. #13
    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
    Ce n'est pas une question qui concernen le langage Java. Si tu as une formule pour calculer ça, et les données adéquates, la réponse est oui, sinon, c'est non.
    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. #14
    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 essayé pendant tout le week end de chercher une solution apart faire comme au début (declarer un rouge vert bleu pour chacune des deux images) et calculer la comme et la medianne de chacune des deux je viens vers vous por vous demandez est ce y'a t'il un moyen en allant de l'histogramme bilineaire que j'ai deja calculer et non refaire la même rout de l'histogramme monolineaire ? Voilà mon code de histogramme bilineaire

    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
     
    public class Histogrammebilineaire extends PanelImage{
     
    	BufferedImage monImage;
    	BufferedImage monImage2;
     
     
    	public  void fenetre(){
     
    		JFrame fenetre = new JFrame();
    		fenetre.setSize(364, 330);
    		fenetre.setTitle("Histogramme Bilinéaire");
    		JPanel tmp=new JPanel();
    		JLabel j = new JLabel(new ImageIcon("d:/Charte.PNG"));
    		JLabel j2=new JLabel (new ImageIcon("d:/chartecouleur.PNG"));
    		JLabel j3=new JLabel (new ImageIcon("d:/AXE.PNG"));
    		JPanel panneau = new Histogrammebilineaire();
    		tmp.setLayout(new BorderLayout());
    		   tmp.add(panneau, BorderLayout.CENTER);
    		   tmp.add(j, BorderLayout.EAST);
    		   tmp.add(j2,BorderLayout.NORTH);
    		   tmp.add(j3,BorderLayout.WEST);
    		panneau.setBackground(Color.WHITE);
    		fenetre.add(tmp);
    		//fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    fenetre.setLocationRelativeTo(null);
    		fenetre.setVisible(true);
     
    	}
     
    	@Override
    	public void paintComponent(Graphics g) {
     
     
    		super.paintComponent(g);
    		int larg = getWidth();
    		int haut = getHeight();
     
    		int dim = 8; // dimension d'une case de la grille
     
    		int nbCaseMax = 32;// 32 cases max;
     
    		int tailleMax = dim * nbCaseMax; 
    		larg = Math.min(tailleMax, larg);
    		haut = Math.min(tailleMax, haut);
     
    		int largeurImage = Math.min(sImg.getWidth(), hImg.getWidth());
    		int hauteurImage = Math.min(sImg.getHeight(), hImg.getHeight());
     
    		Map<Integer, Integer> map = new HashMap<>();
    		int imax=0;
    		int jmax=0;
     
     
     
                    // 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 = sImg.getRGB(i, j);
    				int gray = ((pixel >> 16) & 0xFF) >> 3;
     
    				int pixel2 = hImg.getRGB(i, j);
    				int gray2 = ((pixel2 >> 16) & 0xFF) >> 3;
     
    				int valeur = (gray << 5) | gray2;
     
    				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 j = key / 32;
    			int i = 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);
                            if (imax<i)
    		                	  imax=i;
    		                  if (jmax<j)
    		                	  jmax=j;
     
    			//System.out.println("i, j  "    +i+","+j);
     
    		    }
     
    		//map.entrySet().forEach(entry-> System.out.println("Clef = " + entry.getKey() +"   Valeur = " + entry.getValue() )); 
    		System.out.println("MAX : " + max);
    		System.out.println("I max   "  +imax);
    		System.out.println("J max    "  +jmax);
     
     
     
    		g.setColor(Color.GREEN); 
     		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
     
    		}
     
    	}
     
     
    }

  15. #15
    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 n'ai rien compris à ta question.

    En revanche, je t'ai déjà dit qu'il ne fallait pas faire de calculs aussi complexes (et relativement long) dans paintComponent (d'où le fait que dans l'un des exemples que je t'avais donné, je dessinais dans une BufferedImage et ensuite je ne faisais que l'afficher dans paintComponent().
    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. #16
    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
    Bien entendu merci , voilà par exemple ici je calcule la medianne de la 1ere image puis je vais refaire la même methode pour le deuxieme (j'ai 2 images dans l'histogramme bilineaire). Ma question est peut on calculer la medianne on allant du resultat de la map qu'on avait deja calculer, (prendre la somme de cette map et calculer la medianne à partir de celle ci)
    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
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
     
    public class Histogrammebilineaire extends PanelImage{
     
    	BufferedImage monImage;
    	BufferedImage monImage2;
    	private final int largeur = 256;
    	   private final int hauteur = 200;
    	private int sumRouge=0;
    	private final int[] rouge = new int[256];
    	   private final int[] vert = new int[256];
    	   private final int[] bleu = new int[256];
    	   private int sumVert=0;
    	   private int sumBleu=0;
    	   private int medianeRouge=0;
    	   private int medianeVert=0;
    	   private int medianeBleu=0;
    	    static int sum;
    	    static int max;
    	    static int position;
    	    static int med;
     
    	public  void fenetre(){
     
    		JFrame fenetre = new JFrame();
    		fenetre.setSize(364, 330);
    		fenetre.setTitle("Histogramme Bilinéaire");
    		JPanel tmp=new JPanel();
    		JLabel j = new JLabel(new ImageIcon("d:/Charte.PNG"));
    		JLabel j2=new JLabel (new ImageIcon("d:/chartecouleur.PNG"));
    		Label j3=new Label("Nbpts : "+Histogrammebilineaire.sum+   " - Mediane :" +Histogrammebilineaire.med);
    		JPanel panneau = new Histogrammebilineaire();
    		tmp.setLayout(new BorderLayout());
    		   tmp.add(panneau, BorderLayout.CENTER);
    		   tmp.add(j, BorderLayout.EAST);
    		   tmp.add(j2,BorderLayout.NORTH);
    		   tmp.add(j3,BorderLayout.WEST);
    		panneau.setBackground(Color.WHITE);
    		fenetre.add(tmp);
    		//fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    fenetre.setLocationRelativeTo(null);
    		fenetre.setVisible(true);
     
    	}
    	 public Histogrammebilineaire(){
    		 recupererRVB();
                 sumRouge = sum(rouge);
                 sumVert = sum(vert);
                 sumBleu = sum(bleu);
                 medianeRouge = medianne(rouge,sumRouge);
                 medianeVert = medianne(vert,sumVert);
                 medianeBleu = medianne(bleu, sumBleu);
                 tracerHistogrammes();
    	   }
     
    	 public void Setsum(int sum) {
    			this.sum=sum;
    		}
    	   public void Setmed(int med) {
    			this.med=med;
    		}
     
    	   private void tracerHistogrammes() {
    		   histogramme = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
    		      Graphics2D dessin = histogramme.createGraphics();
    		      tracerHistogramme(dessin, rouge ,sumRouge, medianeRouge);
    		      dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
    		      tracerHistogramme(dessin, vert,sumVert,medianeVert);
    		      dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
    		      tracerHistogramme(dessin, bleu,sumBleu,medianeBleu);
     
     
    		      dessin.dispose(); // toujours disposer aprés utilisation
     
     
    		   }
    	@Override
    	public void paintComponent(Graphics g) {
     
     
    		super.paintComponent(g);
    		int larg = getWidth();
    		int haut = getHeight();
     
    		int dim = 8; // dimension d'une case de la grille
     
    		int nbCaseMax = 32;// 32 cases max;
     
    		int tailleMax = dim * nbCaseMax; 
    		larg = Math.min(tailleMax, larg);
    		haut = Math.min(tailleMax, haut);
     
    		int largeurImage = Math.min(sImg.getWidth(), hImg.getWidth());
    		int hauteurImage = Math.min(sImg.getHeight(), hImg.getHeight());
     
    		Map<Integer, Integer> map = new HashMap<>();
    		int imax=0;
    		int jmax=0;
     
     
     
                    // 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 = sImg.getRGB(i, j);
    				int gray = ((pixel >> 16) & 0xFF) >> 3;
     
    				int pixel2 = hImg.getRGB(i, j);
    				int gray2 = ((pixel2 >> 16) & 0xFF) >> 3;
     
    				int valeur = (gray << 5) | gray2;
     
    				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 j = key / 32;
    			int i = 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);
                            if (imax<i)
    		                	  imax=i;
    		                  if (jmax<j)
    		                	  jmax=j;
     
    			//System.out.println("i, j  "    +i+","+j);
     
    		    }
     
    		//map.entrySet().forEach(entry-> System.out.println("Clef = " + entry.getKey() +"   Valeur = " + entry.getValue() )); 
    		System.out.println("MAX : " + max);
    		System.out.println("I max   "  +imax);
    		System.out.println("J max    "  +jmax);
     
     
     
    		g.setColor(Color.GREEN); 
     		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 int[] toArray(int argb) {
     
    		   int[] array = new int[3];
     
    		   array[0] = (argb >> 16 ) & 0xff;
    		   array[1] = (argb >> 8 ) & 0xff;
    		   array[2] = (argb) & 0xff;
     
    		   return array;
           } 
    	   private void recupererRVB() { 
    		      int maximum = 0;
    		      for (int y=0; y<hImg.getHeight(); y++)
    		         for (int x=0; x<hImg.getWidth(); x++) {
    		            int[] rgb = toArray(hImg.getRGB(x, y));
    		            rouge[rgb[0]]++;
    		            vert[rgb[1]]++;
    		            bleu[rgb[2]]++;
    		         }          
    		   }
     
    	   private int sum(int[] array) {
    		     int somme=0;
    		     for(int i : array) {
    		         somme += i ;
    		         }
    		     return somme;
    		}
     
    	   private int medianne(int[] array, int sum) {
    		   int val = -1;
    		   int mediane=0;
    		   for(int i=0; i<array.length; i++) {
    		       mediane += array[i];
    		       if(mediane>sum/2 ){
    			     val=i;
    		             break;
    		       }
    		   }
    		   return val ;
    		}
     
    	   private void tracerHistogramme( Graphics2D dessin, int[] couleur,int somme, int mediane) {
     
    		   Setsum(somme); 
    		   Setmed(mediane);
    	      }
    }

  17. #17
    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
    Ma question est peut on calculer la medianne on allant du resultat de la map qu'on avait deja calculer, (prendre la somme de cette map et calculer la medianne à partir de celle ci)
    Oui, on peut calculer la moyenne des valeurs de la map.

    Par exemple (pour une Map non vide forcément) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double avg = map.values().stream().reduce((o,n)-> o+n).map(Integer::doubleValue).get())/map.size();
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double avg=0;	
    	for(int value : map.values()) {
    		avg+=value;
    	}
    	avg /= map.size();
    ou encore si la somme des valeurs peut passer en overflow, éventuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    double avg=0;
    	int nb=0;
    	for(int value : map.values()) {
    		if ( nb==0 ) {
    			avg = value;
    			nb = 1;
    		}
    		else {
    			avg *= nb;
    			avg += value;
    			nb++;
    			avg /= nb;
    		}
    	}
    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. Arbre ORB et calcul de médiane
    Par Heimdall dans le forum Programmation parallèle, calcul scientifique et de haute performance (HPC)
    Réponses: 0
    Dernier message: 16/01/2012, 23h30
  2. [AC-2000] Erreur "ByRef" pour un calcul de Médiane
    Par Cantalou dans le forum VBA Access
    Réponses: 16
    Dernier message: 24/11/2009, 12h47
  3. Trouver la médiane d'un ensemble de valeur
    Par contremaitre dans le forum Contribuez
    Réponses: 4
    Dernier message: 22/07/2008, 09h29
  4. Réponses: 2
    Dernier message: 25/04/2008, 07h49
  5. Stat calculer : Quartile ? Médiane ? ...
    Par Beamish dans le forum Access
    Réponses: 8
    Dernier message: 01/12/2005, 15h33

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