From 0f45743889d508a6c9190c78f0b074b95c0f5c66 Mon Sep 17 00:00:00 2001
From: Patrick Imbo <patrick.imbo@c-s.fr>
Date: Thu, 31 Aug 2006 10:07:44 +0000
Subject: [PATCH] =?UTF-8?q?HistogramStatisticFunction=20:=20modif=20des=20?=
 =?UTF-8?q?m=C3=A9thodes=20CalculateEntropy()=20et=20CalculateMean()=20pou?=
 =?UTF-8?q?r=20prendre=20en=20compte=20un=20histogramme=20=C3=A0=20N-dimen?=
 =?UTF-8?q?sion?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Code/Common/otbHistogramStatisticsFunction.h  |  3 +-
 .../Common/otbHistogramStatisticsFunction.txx | 49 +++++++------------
 .../Common/otbHistogramStatisticsFunction.cxx | 20 +++++---
 3 files changed, 31 insertions(+), 41 deletions(-)

diff --git a/Code/Common/otbHistogramStatisticsFunction.h b/Code/Common/otbHistogramStatisticsFunction.h
index 39e88bbf4a..94bcf9aff0 100644
--- a/Code/Common/otbHistogramStatisticsFunction.h
+++ b/Code/Common/otbHistogramStatisticsFunction.h
@@ -48,7 +48,6 @@ public:
 
   typedef typename TInputHistogram::MeasurementType  MeasurementType;
   typedef typename TInputHistogram::FrequencyType    FrequencyType;
-
   typedef typename itk::NumericTraits<MeasurementType>::RealType RealType;
 
   /**Standard Macros */
@@ -56,7 +55,7 @@ public:
   itkNewMacro(Self) ;
                                                                                                                                       
   /** Typedef for the output type */
-  typedef TOutput OutputType;
+  typedef std::vector<TOutput> OutputType;
                                                                                                                                       
   /** Returns the entropy value */
   OutputType GetEntropy();
diff --git a/Code/Common/otbHistogramStatisticsFunction.txx b/Code/Common/otbHistogramStatisticsFunction.txx
index 91b1629995..760b9539e1 100644
--- a/Code/Common/otbHistogramStatisticsFunction.txx
+++ b/Code/Common/otbHistogramStatisticsFunction.txx
@@ -74,14 +74,7 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
 {
   typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
 
-  // TODO: as an improvement, the class could accept multi-dimensional histograms
-  // and the user could specify the dimension to apply the algorithm to.
-  if (histogram->GetSize().GetSizeDimension() != 1)
-    {
-    itkExceptionMacro(<<"Histogram must be 1-dimensional.");
-    }
 
-  // compute global mean
   typename TInputHistogram::ConstIterator iter = histogram->Begin() ;
   typename TInputHistogram::ConstIterator end = histogram->End() ;
 
@@ -101,7 +94,8 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
       } 
     ++iter ;
     }
-  m_entropy = static_cast<OutputType>(entropy); 
+  m_entropy.resize(1);
+  m_entropy[0] = static_cast<TOutput>(entropy); 
 }
 
 
@@ -112,31 +106,22 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
 {
   typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
 
-  // TODO: as an improvement, the class could accept multi-dimensional histograms
-  // and the user could specify the dimension to apply the algorithm to.
-  if (histogram->GetSize().GetSizeDimension() != 1)
-    {
-    itkExceptionMacro(<<"Histogram must be 1-dimensional.");
-    }
-
-  // compute global mean
-  typename TInputHistogram::ConstIterator iter = histogram->Begin() ;
-  typename TInputHistogram::ConstIterator end = histogram->End() ;
+  unsigned int NumberOfDimension =  histogram->GetSize().GetSizeDimension();
+  std::vector<TOutput> GlobalMean(NumberOfDimension);
+  m_mean.resize(NumberOfDimension);
 
-  RealType mean = itk::NumericTraits<RealType>::Zero;
-  FrequencyType globalFrequency = histogram->GetTotalFrequency();
-  if(globalFrequency == 0)
-    {
-    itkExceptionMacro(<<"Histogram must contain at least 1 element.");
-    }
-  while (iter != end)
+  for( unsigned int noDim = 0; noDim < NumberOfDimension; noDim++ )
     {
-    mean += static_cast<RealType>(iter.GetMeasurementVector()[0]) * static_cast<RealType>(iter.GetFrequency());
-    ++iter ;
-    }
-  mean /= static_cast<RealType>(globalFrequency);
-  
-  m_mean = static_cast<OutputType>(mean); 
+    MeasurementType mean = itk::NumericTraits<MeasurementType>::Zero;
+    for (unsigned int i = 0; i < histogram->GetSize()[noDim]; i++)
+      {
+      MeasurementType val  = histogram->GetMeasurement(i, noDim);
+      FrequencyType freq = histogram->GetFrequency(i, noDim);
+      mean += val*freq;
+      }
+    mean /=  histogram->GetTotalFrequency();
+    m_mean[noDim] = static_cast<TOutput>(mean);
+    }  
 }
 
 template< class TInputHistogram, class TOutput >
@@ -144,6 +129,7 @@ void
 HistogramStatisticsFunction< TInputHistogram, TOutput>
 ::CalculateCovariance()
 {
+#if 0
   typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
 
   // TODO: as an improvement, the class could accept multi-dimensional histograms
@@ -173,6 +159,7 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
   covariance /= static_cast<RealType>(globalFrequency);
   
   m_covariance = static_cast<OutputType>(covariance); 
+#endif
 }
 
 template< class TInputHistogram, class TOutput >
diff --git a/Testing/Code/Common/otbHistogramStatisticsFunction.cxx b/Testing/Code/Common/otbHistogramStatisticsFunction.cxx
index 7cf3669970..870f2efdda 100644
--- a/Testing/Code/Common/otbHistogramStatisticsFunction.cxx
+++ b/Testing/Code/Common/otbHistogramStatisticsFunction.cxx
@@ -61,7 +61,11 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
   MeasurementType Mean;
   MeasurementType Covariance;
 
-  Entropy = HistogramStatisticsFunction->GetEntropy();
+  std::cout << "Update OK : " <<  std::endl;
+
+  std::cout << "Entropy 1 : " << HistogramStatisticsFunction->GetEntropy()[0] << std::endl;
+
+  Entropy = HistogramStatisticsFunction->GetEntropy()[0];
   std::cout << "Entropy 1 : " << Entropy << std::endl;
  
   if(fabs(Entropy-log(NbOfBins))>0.00001 ) 
@@ -70,7 +74,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
 	return EXIT_FAILURE;
   }
 
-  Mean = HistogramStatisticsFunction->GetMean();
+  Mean = HistogramStatisticsFunction->GetMean()[0];
   std::cout << "Mean 1 : " << Mean << std::endl;
  
   if( Mean != NbOfBins/2. ) 
@@ -78,7 +82,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
   	std::cout << "Error in mean estimation" << std::endl;
 	return EXIT_FAILURE;
   }
-
+/*
   Covariance = HistogramStatisticsFunction->GetCovariance();
   std::cout << "Covariance 1 : " << Covariance << std::endl;
 
@@ -87,7 +91,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
   	std::cout << "Error in covariance estimation" << std::endl;
 	return EXIT_FAILURE;
   }
-
+*/
   // create histogram just all value equal to zero except the first one
   for (HistogramType::Iterator iter = histogram->Begin(); iter != histogram->End(); ++iter)
     {
@@ -103,7 +107,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
  
   HistogramStatisticsFunction->Update();
 
-  Entropy = HistogramStatisticsFunction->GetEntropy();
+  Entropy = HistogramStatisticsFunction->GetEntropy()[0];
   std::cout << "Entropy 2 : " << Entropy << std::endl;
 
   if( Entropy!=0.0 ) 
@@ -112,7 +116,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
 	return EXIT_FAILURE;
   }
 
-  Mean = HistogramStatisticsFunction->GetMean();
+  Mean = HistogramStatisticsFunction->GetMean()[0];
   std::cout << "Mean 2 : " << Mean << std::endl;
 
   if( Mean != 0.5 ) 
@@ -120,7 +124,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
   	std::cout << "Error in mean estimation" << std::endl;
 	return EXIT_FAILURE;
   }
-
+/*
   Covariance = HistogramStatisticsFunction->GetCovariance();
   std::cout << "Covariance 2 : " << Covariance << std::endl;
 
@@ -129,6 +133,6 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
   	std::cout << "Error in covariance estimation" << std::endl;
 	return EXIT_FAILURE;
   }
-  
+*/  
   return EXIT_SUCCESS;
 }
-- 
GitLab