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