From 17cb6544f1d439bdf11733fedf036cb9515e463d Mon Sep 17 00:00:00 2001 From: ariotte <ariotte@PC-EII16.admr.insa> Date: Tue, 3 Jul 2018 16:46:24 +0200 Subject: [PATCH] centralisation of entropy calculation using image.h --- app/Algorithms/Pyramid.cpp | 33 ++++-------------------------- app/Operations/DPCM.cpp | 32 +++++++---------------------- app/Operations/DoubleEntropyOp.cpp | 16 +-------------- app/Operations/EntropyOp.cpp | 14 +------------ app/Operations/Transforms.cpp | 11 ++++------ lib/detiq-t | 2 +- 6 files changed, 18 insertions(+), 90 deletions(-) diff --git a/app/Algorithms/Pyramid.cpp b/app/Algorithms/Pyramid.cpp index d9ad535..6dabc89 100644 --- a/app/Algorithms/Pyramid.cpp +++ b/app/Algorithms/Pyramid.cpp @@ -612,35 +612,10 @@ int Pyramid::etage_max(const Image *im) ----------------------------------------------------------------------*/ float Pyramid::entropie2(const uint8_t *tab,int taille_c,int taille_l) { - int i,j; - float pi[256],h=0; - int size; - - size=taille_c*taille_l; - -/**********************************************************************/ -/* module de traitement */ -/**********************************************************************/ - -/* initialisation 0 du tableau pi contenant l'histogramme */ - for(i=0 ; i<256 ; i++) - pi[i] = 0; - -/* calcul de l'histogramme de l'image */ - for(i=0 ; i<taille_l ; i++) - for(j=0 ; j<taille_c ; j++) - pi[*(tab+ i*taille_c +j)]++; - -/* calcul de l'entropie de l'image */ - for(i=0 ; i<256 ; i++) - { - if(pi[i] != 0) - { - pi[i] /= size; - h -= (double)pi[i] * log((double)pi[i])/log((double)2.0); - } - } - return(h); + Image * tmp = new Image(taille_c, taille_l, 1, tab); + float entropy = tmp->getEntropy(); + delete tmp; + return entropy; } /*---------------------------------------------------------------------- diff --git a/app/Operations/DPCM.cpp b/app/Operations/DPCM.cpp index 81d425e..27ff362 100644 --- a/app/Operations/DPCM.cpp +++ b/app/Operations/DPCM.cpp @@ -86,10 +86,6 @@ string DPCM::execute( const GrayscaleImage *im, Prediction prediction_alg, image } } - /* mise a 0 du tableau des probas servant pour le calcul de - l'entropie de l'erreur de prdiction */ - for(int i=0 ; i<512 ; i++) {pi[i]= 0.; piq[i]=0;} - /* codage de l'image */ for(int i=1; i<imgHeight ; i++) { @@ -162,10 +158,6 @@ string DPCM::execute( const GrayscaleImage *im, Prediction prediction_alg, image quant_pred_err = quantdef->valueOf(pred_err); quantized_prediction_error_image->setPixelAt(j, i, quant_pred_err); - //mise a jour proba pour calcul entropie - pi[pred_err+255]++; - piq[quant_pred_err+255]++; /* proba associe a l'erreur de prediction */ - nbpt++; quantized_prediction_error_image->setPixelAt(j, i, quant_pred_err); @@ -182,25 +174,15 @@ string DPCM::execute( const GrayscaleImage *im, Prediction prediction_alg, image } } - /* calcul de l'entropie de l'image d'erreur de prediction quantifiee */ - nbpt = imgHeight*imgWidth; - for(int i=0 ; i < 512 ; i++) - { - if(pi[i] != 0) { - pi[i] /= nbpt; - h -= (double)pi[i] * log((double)pi[i])/log((double)2.0); - } - if(piq[i] != 0) { - piq[i] /= nbpt; - hq -= (double)piq[i] * log((double)piq[i])/log((double)2.0); - } - } + + double pred_err_entrop = predction_error_image->getEntropy(); + sprintf(buffer, "\nL'entropie de l'image d'erreur de prediction vaut : %f\n", pred_err_entrop); + + + double quant_pred_err_entrop = quantized_prediction_error_image->getEntropy(); + sprintf(buffer2, "\nL'entropie de l'image d'erreur de prediction quantifiee vaut : %f\n", quant_pred_err_entrop); - //reprendre le code de DoubleEntropyOp pour voir si on obtient le même résultat - /* affichage des rsultats */ - sprintf(buffer, "\nL'entropie de l'image d'erreur de prediction vaut : %lf\n",h); - sprintf(buffer2, "\nL'entropie de l'image d'erreur de prediction quantifiee vaut : %lf\n",hq); returnval = returnval + buffer; returnval = returnval + "\n"; returnval = returnval + buffer2; diff --git a/app/Operations/DoubleEntropyOp.cpp b/app/Operations/DoubleEntropyOp.cpp index 4535898..45a42a2 100644 --- a/app/Operations/DoubleEntropyOp.cpp +++ b/app/Operations/DoubleEntropyOp.cpp @@ -38,21 +38,7 @@ DoubleEntropyOp::DoubleEntropyOp() : DoubleOperation(qApp->translate("Operations void DoubleEntropyOp::operator()(const Image_t<double>* image, const std::map<const imagein::Image_t<double>*, std::string>&) { - double entropy = 0.; - int min = image->min(); - int max = image->max(); - for(unsigned int c = 0; c < image->getNbChannels(); ++c) { - Histogram histo = image->getHistogramForEntropy(c, 511); -// for(int i = -255; i < 256 ; ++i) { - for(int i = min; i<= max; i++){ - if(histo[i] > 0) { - double p = (double)histo[i] / image->getWidth() /image->getHeight(); - entropy += p * log(p); - } - } - } - - entropy = - entropy / log(2); + double entropy = image->getEntropy(); outText(qApp->translate("Operations", "Entropy of the image (sum of channels entropy) = %1").arg(entropy).toStdString()); } diff --git a/app/Operations/EntropyOp.cpp b/app/Operations/EntropyOp.cpp index cf55946..c87bfda 100644 --- a/app/Operations/EntropyOp.cpp +++ b/app/Operations/EntropyOp.cpp @@ -38,19 +38,7 @@ EntropyOp::EntropyOp() : Operation(qApp->translate("Operations", "Calcul d'entro void EntropyOp::operator()(const Image* image, const std::map<const imagein::Image*, std::string>&) { - double entropy = 0.; - - for(unsigned int c = 0; c < image->getNbChannels(); ++c) { - Histogram histo = image->getHistogram(c); - for(int i = 0; i < 256; ++i) { - if(histo[i] > 0) { - double p = (double)histo[i] / image->getWidth() /image->getHeight(); - entropy += p * log(p); - } - } - } - - entropy = - entropy / log(2); + double entropy = image->getEntropy(); outText(qApp->translate("Operations", "Entropy of the image (sum of channels entropy) = %1").arg(entropy).toStdString()); } diff --git a/app/Operations/Transforms.cpp b/app/Operations/Transforms.cpp index 27fa93a..da4bd00 100644 --- a/app/Operations/Transforms.cpp +++ b/app/Operations/Transforms.cpp @@ -33,12 +33,9 @@ const double pid2 = 1.57079632679489661923132169163975144209858469968755291; const double sqrt2 = 1.414213562373095048801688724209698078569671875376948; Image_t<double>* Transforms::hough(const GrayscaleImage *image ) { //TODO : inverser i et j i (ligne) et j (colonne) -// int height = image->getHeight(); -// int width = image->getWidth(); -// const uint8_t* tabim = image->begin(); -// double* itab = new double[ image->size() ]; -// for(unsigned int i = 0; i < image->size(); ++i) itab[i] = 0; + double diag = sqrt(image->getWidth()*image->getWidth() + image->getHeight()*image->getHeight()); + Image_t<double>* resImg = new Image_t<double>(diag+0.5, 90+180, 1, 0.); for(unsigned int i = 0; i < image->getHeight(); i++) { @@ -263,8 +260,7 @@ string Transforms::hough2_inverse(const Image_t<double> *image, Image** resImgpt // sprintf( buffer, "Valeur Max de la matrice d'entre=%d",(int)(max+0.1)); - double angleStep = 270. / image->getHeight(); //les angles varient de -90 à +180 = intervalle de longueur 271 degre - //double imageDiag = resImg->getWidth() * sqrt(2.); + double angleStep = 270. / image->getHeight(); //les angles varient de -90 à +180 = intervalle de longueur 270 degre double imageDiag = sqrt(width*width + height*height); double rhoStep = imageDiag / (image->getWidth() - 1 ); @@ -329,6 +325,7 @@ string Transforms::hough2_inverse(const Image_t<double> *image, Image** resImgpt } *resImgptr = resStdImg; + delete resImg; return ""; } diff --git a/lib/detiq-t b/lib/detiq-t index 469e62d..dae5d89 160000 --- a/lib/detiq-t +++ b/lib/detiq-t @@ -1 +1 @@ -Subproject commit 469e62d88c1c54d95a706527377762fe93dbb20a +Subproject commit dae5d89fb10794280fa69dd6595f64577de6a3c5 -- GitLab