17 #ifndef __itkHistogramImageToImageMetric_txx
18 #define __itkHistogramImageToImageMetric_txx
22 #include "itkNumericTraits.h"
28 template <
class TFixedImage,
class TMovingImage>
32 itkDebugMacro(
"Constructor");
34 m_HistogramSize.Fill(256);
35 m_UsePaddingValue =
false;
36 m_DerivativeStepLength = 0.1;
37 m_DerivativeStepLengthScales.Fill(1);
38 m_UpperBoundIncreaseFactor = 0.001;
40 m_Histogram = HistogramType::New();
41 #ifdef ITK_USE_REVIEW_STATISTICS
42 m_Histogram->SetMeasurementVectorSize(2);
44 m_LowerBoundSetByUser =
false;
45 m_UpperBoundSetByUser =
false;
49 template <
class TFixedImage,
class TMovingImage>
53 m_UpperBound = bounds;
54 m_UpperBoundSetByUser =
true;
59 template <
class TFixedImage,
class TMovingImage>
63 m_LowerBound = bounds;
64 m_LowerBoundSetByUser =
true;
68 template <
class TFixedImage,
class TMovingImage>
72 Superclass::Initialize();
74 if (!this->m_FixedImage)
76 itkExceptionMacro(<<
"Fixed image has not been set.");
78 else if (!this->m_MovingImage)
80 itkExceptionMacro(<<
"Moving image has not been set.");
83 if( !m_LowerBoundSetByUser || !m_UpperBoundSetByUser )
102 else if (value > maxFixed)
114 GetBufferedRegion());
123 if (value < minMoving)
127 else if (value > maxMoving)
136 if( !m_LowerBoundSetByUser )
138 #ifdef ITK_USE_REVIEW_STATISTICS
139 m_LowerBound.SetSize(2);
141 m_LowerBound[0] = minFixed;
142 m_LowerBound[1] = minMoving;
145 if( !m_UpperBoundSetByUser )
147 #ifdef ITK_USE_REVIEW_STATISTICS
148 m_UpperBound.SetSize(2);
151 maxFixed + (maxFixed - minFixed ) * m_UpperBoundIncreaseFactor;
153 maxMoving + (maxMoving - minMoving ) * m_UpperBoundIncreaseFactor;
160 template <
class TFixedImage,
class TMovingImage>
165 if(m_DerivativeStepLengthScales.GetSize()
169 m_DerivativeStepLengthScales.Fill(1.0);
171 Superclass::SetTransform(transform);
174 template <
class TFixedImage,
class TMovingImage>
179 itkDebugMacro(
"GetValue( " << parameters <<
" ) ");
181 this->ComputeHistogram(parameters, *m_Histogram);
183 return this->EvaluateMeasure(*m_Histogram);
186 template <
class TFixedImage,
class TMovingImage>
192 itkDebugMacro(
"GetDerivative( " << parameters <<
" ) ");
194 const unsigned int ParametersDimension = this->GetNumberOfParameters();
197 if (m_DerivativeStepLengthScales.size() != ParametersDimension)
199 itkExceptionMacro(<<
"The size of DerivativesStepLengthScales is "
200 << m_DerivativeStepLengthScales.size()
201 <<
", but the Number of Parameters is "
202 << ParametersDimension
212 #ifdef ITK_USE_REVIEW_STATISTICS
213 pHistogram->SetMeasurementVectorSize(2);
215 this->ComputeHistogram(parameters, *pHistogram);
217 for (
unsigned int i = 0; i < ParametersDimension; i++)
220 #ifdef ITK_USE_REVIEW_STATISTICS
221 pHistogram2->SetMeasurementVectorSize(2);
223 this->CopyHistogram(*pHistogram2, *pHistogram);
227 m_DerivativeStepLength/m_DerivativeStepLengthScales[i];
228 this->ComputeHistogram(newParameters, *pHistogram2);
232 pHistogram2 = HistogramType::New();
233 #ifdef ITK_USE_REVIEW_STATISTICS
234 pHistogram2->SetMeasurementVectorSize(2);
236 this->CopyHistogram(*pHistogram2, *pHistogram);
238 newParameters = parameters;
240 m_DerivativeStepLength/m_DerivativeStepLengthScales[i];
241 this->ComputeHistogram(newParameters, *pHistogram2);
246 (e1 - e0)/(2*m_DerivativeStepLength/m_DerivativeStepLengthScales[i]);
250 template <
class TFixedImage,
class TMovingImage>
257 value = GetValue(parameters);
258 this->GetDerivative(parameters, derivative);
261 template <
class TFixedImage,
class TMovingImage>
271 itkExceptionMacro(<<
"Fixed image has not been assigned");
277 typename FixedImageType::IndexType index;
278 typename FixedImageType::RegionType fixedRegion;
280 fixedRegion = this->GetFixedImageRegion();
281 FixedIteratorType ti( fixedImage, fixedRegion );
283 this->m_NumberOfPixelsCounted = 0;
284 this->SetTransformParameters( parameters );
286 histogram.
Initialize( m_HistogramSize, m_LowerBound, m_UpperBound );
289 while ( !ti.IsAtEnd() )
291 index = ti.GetIndex();
293 if (fixedRegion.IsInside(index) &&
294 (!m_UsePaddingValue ||
295 (m_UsePaddingValue && ti.Get() > m_PaddingValue)))
298 fixedImage->TransformIndexToPhysicalPoint(index, inputPoint);
300 if( this->m_FixedImageMask &&
301 !this->m_FixedImageMask->IsInside( inputPoint ) )
308 this->m_Transform->TransformPoint(inputPoint);
310 if( this->m_MovingImageMask &&
311 !this->m_MovingImageMask->IsInside( transformedPoint ) )
317 if ( this->m_Interpolator->IsInsideBuffer(transformedPoint) )
320 this->m_Interpolator->Evaluate(transformedPoint);
321 const RealType fixedValue = ti.Get();
322 this->m_NumberOfPixelsCounted++;
325 #ifdef ITK_USE_REVIEW_STATISTICS
328 sample[0] = fixedValue;
329 sample[1] = movingValue;
337 itkDebugMacro(
"NumberOfPixelsCounted = " << this->m_NumberOfPixelsCounted );
338 if (this->m_NumberOfPixelsCounted == 0)
341 <<
"All the points mapped to outside of the moving image");
345 template <
class TFixedImage,
class TMovingImage>
353 #ifdef ITK_USE_REVIEW_STATISTICS
360 for (
unsigned int i = 0; i < min.Size(); i++)
365 for (
unsigned int i = 0; i < max.Size(); i++)
367 max[i] = source.
GetBinMax(i, size[i] - 1);
378 while (sourceIt != sourceEnd && targetIt != targetEnd)
380 #ifdef ITK_USE_REVIEW_STATISTICS
381 typename HistogramType::AbsoluteFrequencyType
397 template <
class TFixedImage,
class TMovingImage>
402 Superclass::PrintSelf(os,indent);
403 os << indent <<
"Padding value: "
407 os << indent <<
"Use padding value?: " << m_UsePaddingValue << std::endl;
408 os << indent <<
"Derivative step length: " << m_DerivativeStepLength
410 os << indent <<
"Derivative step length scales: ";
411 os << m_DerivativeStepLengthScales << std::endl;
412 os << indent <<
"Histogram size: ";
413 os << m_HistogramSize << std::endl;
414 os << indent <<
"Histogram upper bound increase factor: ";
415 os << m_UpperBoundIncreaseFactor << std::endl;
416 os << indent <<
"Histogram computed by GetValue(): ";
417 os << m_Histogram.GetPointer() << std::endl;
422 #endif // itkHistogramImageToImageMetric_txx