19 #ifndef __otbHistogramStatisticsFunction_txx
20 #define __otbHistogramStatisticsFunction_txx
27 template<
class TInputHistogram,
class TOutput>
34 template<
class TInputHistogram,
class TOutput>
39 if (m_IsModified ==
true)
46 template<
class TInputHistogram,
class TOutput>
51 if (m_IsModified ==
true)
58 template<
class TInputHistogram,
class TOutput>
63 if (m_IsModified ==
true)
70 template<
class TInputHistogram,
class TOutput>
75 typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
77 typename TInputHistogram::ConstIterator iter = histogram->Begin();
78 typename TInputHistogram::ConstIterator end = histogram->End();
80 RealType entropy = itk::NumericTraits<RealType>::Zero;
81 FrequencyType globalFrequency = histogram->GetTotalFrequency();
82 if (globalFrequency == 0)
84 itkExceptionMacro(<<
"Histogram must contain at least 1 element.");
89 Proba /=
static_cast<RealType>(globalFrequency);
92 entropy -= Proba * vcl_log(Proba);
97 m_entropy[0] =
static_cast<TOutput
>(entropy);
100 template<
class TInputHistogram,
class TOutput>
105 typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
107 unsigned int NumberOfDimension = histogram->GetSize().GetSizeDimension();
108 m_mean.resize(NumberOfDimension);
110 if (histogram->GetTotalFrequency() == 0)
112 itkExceptionMacro(<<
"Histogram must contain at least 1 element.");
115 if (NumberOfDimension > 2)
117 itkExceptionMacro(<<
"Histogram must have 1 or 2 dimension.");
120 for (
unsigned int noDim = 0; noDim < NumberOfDimension; noDim++)
123 for (
unsigned int i = 0; i < histogram->GetSize()[noDim]; ++i)
129 mean /= histogram->GetTotalFrequency();
130 m_mean[noDim] =
static_cast<TOutput
>(mean);
134 template<
class TInputHistogram,
class TOutput>
141 typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
143 unsigned int NumberOfDimension = histogram->GetSize().GetSizeDimension();
144 m_covariance.resize(NumberOfDimension * NumberOfDimension);
146 if (histogram->GetTotalFrequency() == 0)
148 itkExceptionMacro(<<
"Histogram must contain at least 1 element.");
151 for (
unsigned int noDimX = 0; noDimX < NumberOfDimension; noDimX++)
152 for (
unsigned int noDimY = 0; noDimY < NumberOfDimension; noDimY++)
154 MeasurementType covariance = itk::NumericTraits<MeasurementType>::Zero;
155 for (
unsigned int i = 0; i < histogram->GetSize()[noDimX]; ++i)
156 for (
unsigned int j = 0; j < histogram->GetSize()[noDimY]; ++j)
165 covariance += ((valX * freqX) * (valY * freqY));
167 covariance /= histogram->GetTotalFrequency();
168 m_covariance[noDimX * NumberOfDimension + noDimY] =
static_cast<TOutput
>(covariance);
173 template<
class TInputHistogram,
class TOutput>
181 CalculateCovariance();
182 m_IsModified =
false;
185 template<
class TInputHistogram,
class TOutput>
190 Superclass::PrintSelf(os, indent);