17 #ifndef __itkKullbackLeiblerCompareHistogramImageToImageMetric_txx
18 #define __itkKullbackLeiblerCompareHistogramImageToImageMetric_txx
29 template <
class TFixedImage,
class TMovingImage>
36 template <
class TFixedImage,
class TMovingImage>
41 Superclass::Initialize();
44 template <
class TFixedImage,
class TMovingImage>
46 TMovingImage>::MeasureType
55 MeasureType KullbackLeibler = NumericTraits<MeasureType>::Zero;
63 while (measured_it != measured_end)
66 double TrainingFreq = training_it.
GetFrequency()+m_Epsilon;
67 double MeasuredFreq = measured_it.
GetFrequency()+m_Epsilon;
69 KullbackLeibler += MeasuredFreq*vcl_log(MeasuredFreq/TrainingFreq);
75 if (training_it != training_end)
76 itkWarningMacro(
"The Measured and Training Histograms have different number of bins.");
84 double AdjustedTotalTrainingFreq = totalTrainingFreq +
85 this->GetHistogramSize()[0]*this->GetHistogramSize()[1]*m_Epsilon;
86 double AdjustedTotalMeasuredFreq = totalMeasuredFreq +
87 this->GetHistogramSize()[0]*this->GetHistogramSize()[1]*m_Epsilon;
89 KullbackLeibler = KullbackLeibler/
static_cast<MeasureType>(AdjustedTotalMeasuredFreq)
90 - vcl_log(AdjustedTotalMeasuredFreq/AdjustedTotalTrainingFreq);
92 return KullbackLeibler;
95 template <
class TFixedImage,
class TMovingImage>
99 Superclass::PrintSelf(os, indent);
101 os << indent <<
"Epsilon: " << m_Epsilon << std::endl;
107 #endif // itkKullbackLeiblerCompareHistogramImageToImageMetric_txx