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
|
#include "stdafx.h"
#include "Histogramme.h"
#include <math.h>
#include <vector>
// Histogramme
//constructeur par défaut
CHistogramme::CHistogramme(void)
{
nbCouleurs=64;
}
//constructeur
CHistogramme::CHistogramme(int nbres_coul)
{
this->nbCouleurs=nbres_coul;//donne le nombre de couleur de l'histogramme calculé
}
//constructeur
CHistogramme::CHistogramme(const CHistogramme& histogramme)
{
Element=histogramme.Element;
}
//destructeur
CHistogramme::~CHistogramme(void)
{
delete[] this->Element; //destruction du tableau où toute les valeurs sont connues
}
//méthode de calcul de l'histogramme d'une image avec l'aide des méthodes OPENCV
//avec le nombre de couleurs et le chemin de l'image
void CHistogramme::Calcul(int nbres_coul,CString reference)
{
IplImage* image= 0;
IplImage* rgb[3];
CvHistogram* hist;
nbCouleurs=nbres_coul;
Element=new float[nbres_coul];//tableau qui va contenir toutes les valeurs de l'histogramme
int n=cvRound(cvCbrt(nbres_coul));//arrondi pour la creation de la "base réduite RVB"
//size of the histogram -1D histogram
int taillehist[3]={n,n,n};
int bins = taillehist[0]*taillehist[1]*taillehist[2];
int hsize[] = {bins};
//max and min value of the histogram
float max_value = 0, min_value = 0;
//value and normalized value
float value;
int normalized;
image =cvLoadImage(reference,1);//chargement de l'image
//desentracelement de l'image
//creation de 3 images pour les 3 composantes RVB
/*------------------------ATTENTION-----------------------------
// Il faut savoir que OPENCV est en BGR par défaut et non pas en
// RGB
/--------------------------------------------------------------*/
rgb[0]=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
rgb[1]=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
rgb[2]=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
cvCvtPixToPlane(image,rgb[2],rgb[1],rgb[0],NULL);//creation de l'image des 3 composantes reunies
//get the histogram and some info about it
hist = cvCreateHist( 3, taillehist, CV_HIST_ARRAY, NULL,1);//creation d'un histogramme
cvCalcHist( rgb, hist, 0, NULL);//calcul de l'histogramme
cvGetMinMaxHistValue( hist, &min_value, &max_value);//recupere les valeurs max et min de l'histogramme pour faire la normalisation par la suite
cvNormalizeHist(hist,100.00);//normalisation
//récupération des valeurs de l'histogramme
for(int i=0; i < bins; i++){
value = cvQueryHistValue_1D( hist, i);
Element[i]=value;
}
cvWaitKey();
cvReleaseHist(&hist);
}
//méthode de calcul de l'histogramme d'une image avec l'aide des méthodes OPENCV
//en donnant juste le chemin de l'image
void CHistogramme::Calcul(CString reference)
{
IplImage* image= 0;
IplImage* imgHistogram = 0;
IplImage* rgb[3];
CvHistogram* hist;
int nbres_coul;
nbres_coul=this->nbCouleurs;
Element=new float[nbres_coul];//tableau qui va contenir toutes les valeurs de l'histogramme
int n=cvRound(cvCbrt(nbres_coul));//arrondi pour la creation de la "base réduite RVB"
//size of the histogram -1D histogram
int taillehist[3]={n,n,n};
int bins = taillehist[0]*taillehist[1]*taillehist[2];
int hsize[] = {bins};
//max and min value of the histogram
float max_value = 0, min_value = 0;
//value and normalized value
float value;
int normalized;
image = cvLoadImage(reference,1);
//desentracelement de l'image
//creation de 3 images pour les 3 composantes RVB
/*------------------------ATTENTION-----------------------------
// Il faut savoir que OPENCV est en BGR par défaut et non pas en
// RGB
/--------------------------------------------------------------*/
rgb[0]=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
rgb[1]=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
rgb[2]=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
cvCvtPixToPlane(image,rgb[2],rgb[1],rgb[0],NULL);//creation de l'image des 3 composantes reunies
//get the histogram and some info about it
hist = cvCreateHist( 3, taillehist, CV_HIST_ARRAY, NULL,1);//creation d'un histogramme
cvCalcHist( rgb, hist, 0, NULL);//calcul de l'histogramme
cvGetMinMaxHistValue( hist, &min_value, &max_value);//recupere les valeurs max et min de l'histogramme pour faire la normalisation par la suite
cvNormalizeHist(hist,100.00);//normalisation
//récupération des valeurs de l'histogramme
for(int i=0; i < bins; i++){
value = cvQueryHistValue_1D( hist, i);
Element[i]=value;
}
cvWaitKey();
cvReleaseHist(&hist);
cvReleaseImage(&image);
}
//méthode de calcul des distances entre chaqie bins des histogrammes
float CHistogramme::Distance(CHistogramme* histo)
{
float distance=0;
for(int i=0; i<this->nbCouleurs;i++)
{
distance+=abs(histo->GetElement()[i]-this->Element[i]);
}
return distance;
}
//affecte les valeurs de l'histogramme
void CHistogramme::SetElement(float* nb_px)
{
this->Element=nb_px;
}
//retourne les elements (valeurs de lhistogramme)
float* CHistogramme::GetElement(void)
{
return this->Element;
}
//retourne le ,ombre de couleurs de l'histogramme
int CHistogramme::GetNbCouleurs(void)
{
return this->nbCouleurs;
}
//référence le nombre de couleurs de l'histogramme
void CHistogramme::SetNbCouleurs(int nbres_coul)
{
this->nbCouleurs=nbres_coul;
} |
Partager