Skip to content
Snippets Groups Projects
Commit 0f457438 authored by Patrick Imbo's avatar Patrick Imbo
Browse files

HistogramStatisticFunction : modif des méthodes CalculateEntropy() et...

HistogramStatisticFunction : modif des méthodes CalculateEntropy() et CalculateMean() pour prendre en compte un histogramme à N-dimension
parent 0e26eb52
No related branches found
No related tags found
No related merge requests found
...@@ -48,7 +48,6 @@ public: ...@@ -48,7 +48,6 @@ public:
typedef typename TInputHistogram::MeasurementType MeasurementType; typedef typename TInputHistogram::MeasurementType MeasurementType;
typedef typename TInputHistogram::FrequencyType FrequencyType; typedef typename TInputHistogram::FrequencyType FrequencyType;
typedef typename itk::NumericTraits<MeasurementType>::RealType RealType; typedef typename itk::NumericTraits<MeasurementType>::RealType RealType;
/**Standard Macros */ /**Standard Macros */
...@@ -56,7 +55,7 @@ public: ...@@ -56,7 +55,7 @@ public:
itkNewMacro(Self) ; itkNewMacro(Self) ;
/** Typedef for the output type */ /** Typedef for the output type */
typedef TOutput OutputType; typedef std::vector<TOutput> OutputType;
/** Returns the entropy value */ /** Returns the entropy value */
OutputType GetEntropy(); OutputType GetEntropy();
......
...@@ -74,14 +74,7 @@ HistogramStatisticsFunction< TInputHistogram, TOutput> ...@@ -74,14 +74,7 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
{ {
typename TInputHistogram::ConstPointer histogram = m_InputHistogram; 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 iter = histogram->Begin() ;
typename TInputHistogram::ConstIterator end = histogram->End() ; typename TInputHistogram::ConstIterator end = histogram->End() ;
...@@ -101,7 +94,8 @@ HistogramStatisticsFunction< TInputHistogram, TOutput> ...@@ -101,7 +94,8 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
} }
++iter ; ++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> ...@@ -112,31 +106,22 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
{ {
typename TInputHistogram::ConstPointer histogram = m_InputHistogram; typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
// TODO: as an improvement, the class could accept multi-dimensional histograms unsigned int NumberOfDimension = histogram->GetSize().GetSizeDimension();
// and the user could specify the dimension to apply the algorithm to. std::vector<TOutput> GlobalMean(NumberOfDimension);
if (histogram->GetSize().GetSizeDimension() != 1) m_mean.resize(NumberOfDimension);
{
itkExceptionMacro(<<"Histogram must be 1-dimensional.");
}
// compute global mean
typename TInputHistogram::ConstIterator iter = histogram->Begin() ;
typename TInputHistogram::ConstIterator end = histogram->End() ;
RealType mean = itk::NumericTraits<RealType>::Zero; for( unsigned int noDim = 0; noDim < NumberOfDimension; noDim++ )
FrequencyType globalFrequency = histogram->GetTotalFrequency();
if(globalFrequency == 0)
{
itkExceptionMacro(<<"Histogram must contain at least 1 element.");
}
while (iter != end)
{ {
mean += static_cast<RealType>(iter.GetMeasurementVector()[0]) * static_cast<RealType>(iter.GetFrequency()); MeasurementType mean = itk::NumericTraits<MeasurementType>::Zero;
++iter ; for (unsigned int i = 0; i < histogram->GetSize()[noDim]; i++)
} {
mean /= static_cast<RealType>(globalFrequency); MeasurementType val = histogram->GetMeasurement(i, noDim);
FrequencyType freq = histogram->GetFrequency(i, noDim);
m_mean = static_cast<OutputType>(mean); mean += val*freq;
}
mean /= histogram->GetTotalFrequency();
m_mean[noDim] = static_cast<TOutput>(mean);
}
} }
template< class TInputHistogram, class TOutput > template< class TInputHistogram, class TOutput >
...@@ -144,6 +129,7 @@ void ...@@ -144,6 +129,7 @@ void
HistogramStatisticsFunction< TInputHistogram, TOutput> HistogramStatisticsFunction< TInputHistogram, TOutput>
::CalculateCovariance() ::CalculateCovariance()
{ {
#if 0
typename TInputHistogram::ConstPointer histogram = m_InputHistogram; typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
// TODO: as an improvement, the class could accept multi-dimensional histograms // TODO: as an improvement, the class could accept multi-dimensional histograms
...@@ -173,6 +159,7 @@ HistogramStatisticsFunction< TInputHistogram, TOutput> ...@@ -173,6 +159,7 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
covariance /= static_cast<RealType>(globalFrequency); covariance /= static_cast<RealType>(globalFrequency);
m_covariance = static_cast<OutputType>(covariance); m_covariance = static_cast<OutputType>(covariance);
#endif
} }
template< class TInputHistogram, class TOutput > template< class TInputHistogram, class TOutput >
......
...@@ -61,7 +61,11 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -61,7 +61,11 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
MeasurementType Mean; MeasurementType Mean;
MeasurementType Covariance; 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; std::cout << "Entropy 1 : " << Entropy << std::endl;
if(fabs(Entropy-log(NbOfBins))>0.00001 ) if(fabs(Entropy-log(NbOfBins))>0.00001 )
...@@ -70,7 +74,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -70,7 +74,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
return EXIT_FAILURE; return EXIT_FAILURE;
} }
Mean = HistogramStatisticsFunction->GetMean(); Mean = HistogramStatisticsFunction->GetMean()[0];
std::cout << "Mean 1 : " << Mean << std::endl; std::cout << "Mean 1 : " << Mean << std::endl;
if( Mean != NbOfBins/2. ) if( Mean != NbOfBins/2. )
...@@ -78,7 +82,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -78,7 +82,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in mean estimation" << std::endl; std::cout << "Error in mean estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
/*
Covariance = HistogramStatisticsFunction->GetCovariance(); Covariance = HistogramStatisticsFunction->GetCovariance();
std::cout << "Covariance 1 : " << Covariance << std::endl; std::cout << "Covariance 1 : " << Covariance << std::endl;
...@@ -87,7 +91,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -87,7 +91,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in covariance estimation" << std::endl; std::cout << "Error in covariance estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
*/
// create histogram just all value equal to zero except the first one // create histogram just all value equal to zero except the first one
for (HistogramType::Iterator iter = histogram->Begin(); iter != histogram->End(); ++iter) for (HistogramType::Iterator iter = histogram->Begin(); iter != histogram->End(); ++iter)
{ {
...@@ -103,7 +107,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -103,7 +107,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
HistogramStatisticsFunction->Update(); HistogramStatisticsFunction->Update();
Entropy = HistogramStatisticsFunction->GetEntropy(); Entropy = HistogramStatisticsFunction->GetEntropy()[0];
std::cout << "Entropy 2 : " << Entropy << std::endl; std::cout << "Entropy 2 : " << Entropy << std::endl;
if( Entropy!=0.0 ) if( Entropy!=0.0 )
...@@ -112,7 +116,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -112,7 +116,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
return EXIT_FAILURE; return EXIT_FAILURE;
} }
Mean = HistogramStatisticsFunction->GetMean(); Mean = HistogramStatisticsFunction->GetMean()[0];
std::cout << "Mean 2 : " << Mean << std::endl; std::cout << "Mean 2 : " << Mean << std::endl;
if( Mean != 0.5 ) if( Mean != 0.5 )
...@@ -120,7 +124,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -120,7 +124,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in mean estimation" << std::endl; std::cout << "Error in mean estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
/*
Covariance = HistogramStatisticsFunction->GetCovariance(); Covariance = HistogramStatisticsFunction->GetCovariance();
std::cout << "Covariance 2 : " << Covariance << std::endl; std::cout << "Covariance 2 : " << Covariance << std::endl;
...@@ -129,6 +133,6 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -129,6 +133,6 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in covariance estimation" << std::endl; std::cout << "Error in covariance estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
*/
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment