Créer un histogramme à partir des données d'un vector

Fermé
Bapt_1 Messages postés 2 Date d'inscription samedi 28 novembre 2020 Statut Membre Dernière intervention 28 novembre 2020 - 28 nov. 2020 à 09:31
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 29 nov. 2020 à 00:27
Hi Everybody,

J'aimerai crée un histogramme à partir des données d'un vector.
Mon vecteur est composé de 256 indices. Chaque indices compte le nombre de niveau de gris (présents dans une image) qui correspond à cet indice.

Mon histogramme aura donc 256 colonnes.

Après je souhaite réaliser des stats à partir de l'histogramme.

I would like to print a histogram from datas vector.

My vector is composed of a 256 index and each index counts the number of gray scale level (present in an image) corresponding to the index vector.

Thus, my histogram will have 256 bins.

Next I would like to do statistics (mean, median, min, max) from my histogram


A need help !! Thanks a lot

3 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
28 nov. 2020 à 11:30
Bonjour,

Tu souhaites gérer un histogramme.
Tu ne parles pas de le dessiner, pour cela ça dépend essentiellement de ton environnement graphique qu'il faudra peut-être choisir en fonction de ton système d'exploitation.

Sinon par exemple pour calculer le max de ton histogramme, il y a déjà une fonction dans <algorithm>, pour la moyenne il te faut la somme dans <numeric>:
#include <algorithm>
#include <numeric>
#include <vector>

int  main(){
    std::vector<int>  histogram{ 0, 2 , 17, 21, 99, 92, 80, 61, 60, 59 };
    int  maxi = *std::max_element( histogram.begin(), histogram.end() );
    double  mean =  std::accumulate( histogram.begin(), histogram.end(), 0 )
                  / static_cast<double>(histogram.size());
}
0
Bapt_1 Messages postés 2 Date d'inscription samedi 28 novembre 2020 Statut Membre Dernière intervention 28 novembre 2020
28 nov. 2020 à 17:48
Merci pour ta réponse !!

Je cherche justement a printer l'histogramme.
Je travail sous windows 10.

Je pourrais directement faire les stats sur le vecteur mais mon professeur me demande de travailler sur l'histo ...
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
29 nov. 2020 à 00:27
S'il faut un objet Histogram, il devra bien stocker les données et il les stockera surement dans un vector et les calculs se feront donc sur le vector.
Et pour le tracer, il faut bien savoir quel environnement tu utilises. Par exemple on peut avoir un dessin simpliste en mode console:
#include <iostream>
#include <vector>
#include <algorithm>

class Histogram {
public:
   Histogram( std::vector<int> v ) : data(std::move(v)) {}
   void  draw(){
      const int  h = *std::max_element( data.begin(), data.end() );
      for ( int i = (h+1)/2 ; i > 0; --i ) {
         for ( auto x : data ) {
            if ( x < 2*i-1 )
               std::cout.put(' ');     // rien
            else if ( x == 2*i-1 )
               std::cout.put( '\xDC');  // demi carré
            else
               std::cout.put( '\xDB' ); // carré plein
         }
         endl( std::cout << ' ' << i*2-1);
      }
      endl(std::cout<<std::string(data.size(),'+'));
   }
private:
   std::vector<int>  data;
};

int main(){
   // jeu de caractere Latin-1 = codepage 850 pour avoir des demi-carrés
   system( "chcp 850");
   std::vector<int>  vect{1,7,0,1,7,10,2,4,0,1,2,3,11,5,6,7,8,9,3,4,0,0,1,6,2,3,4,3,1,7,8,0,8,9};
   Histogram  hist( vect );
   hist.draw();
}
0