00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkMattesMutualInformationImageToImageMetric_h
00018 #define __itkMattesMutualInformationImageToImageMetric_h
00019
00020 #include "itkImageToImageMetric.h"
00021 #include "itkCovariantVector.h"
00022 #include "itkPoint.h"
00023 #include "itkIndex.h"
00024 #include "itkBSplineKernelFunction.h"
00025 #include "itkBSplineDerivativeKernelFunction.h"
00026 #include "itkCentralDifferenceImageFunction.h"
00027 #include "itkBSplineInterpolateImageFunction.h"
00028 #include "itkBSplineDeformableTransform.h"
00029
00030
00031 namespace itk
00032 {
00033
00110 template <class TFixedImage,class TMovingImage >
00111 class ITK_EXPORT MattesMutualInformationImageToImageMetric :
00112 public ImageToImageMetric< TFixedImage, TMovingImage >
00113 {
00114 public:
00115
00117 typedef MattesMutualInformationImageToImageMetric Self;
00118 typedef ImageToImageMetric< TFixedImage, TMovingImage > Superclass;
00119 typedef SmartPointer<Self> Pointer;
00120 typedef SmartPointer<const Self> ConstPointer;
00121
00123 itkNewMacro(Self);
00124
00126 itkTypeMacro(MattesMutualInformationImageToImageMetric, ImageToImageMetric);
00127
00129 typedef typename Superclass::TransformType TransformType;
00130 typedef typename Superclass::TransformPointer TransformPointer;
00131 typedef typename Superclass::TransformJacobianType TransformJacobianType;
00132 typedef typename Superclass::InterpolatorType InterpolatorType;
00133 typedef typename Superclass::MeasureType MeasureType;
00134 typedef typename Superclass::DerivativeType DerivativeType;
00135 typedef typename Superclass::ParametersType ParametersType;
00136 typedef typename Superclass::FixedImageType FixedImageType;
00137 typedef typename Superclass::MovingImageType MovingImageType;
00138 typedef typename Superclass::FixedImageConstPointer FixedImageConstPointer;
00139 typedef typename Superclass::MovingImageConstPointer MovingImageCosntPointer;
00140 typedef typename Superclass::CoordinateRepresentationType
00141 CoordinateRepresentationType;
00142
00144 typedef typename FixedImageType::IndexType FixedImageIndexType;
00145 typedef typename FixedImageIndexType::IndexValueType FixedImageIndexValueType;
00146 typedef typename MovingImageType::IndexType MovingImageIndexType;
00147 typedef typename TransformType::InputPointType FixedImagePointType;
00148 typedef typename TransformType::OutputPointType MovingImagePointType;
00149
00151 itkStaticConstMacro( MovingImageDimension, unsigned int,
00152 MovingImageType::ImageDimension );
00153
00161 virtual void Initialize(void) throw ( ExceptionObject );
00162
00164 void GetDerivative(
00165 const ParametersType& parameters,
00166 DerivativeType & Derivative ) const;
00167
00169 MeasureType GetValue( const ParametersType& parameters ) const;
00170
00172 void GetValueAndDerivative( const ParametersType& parameters,
00173 MeasureType& Value, DerivativeType& Derivative ) const;
00174
00176 itkSetClampMacro( NumberOfSpatialSamples, unsigned long,
00177 1, NumericTraits<unsigned long>::max() );
00178 itkGetConstMacro( NumberOfSpatialSamples, unsigned long);
00179
00181 itkSetClampMacro( NumberOfHistogramBins, unsigned long,
00182 1, NumericTraits<unsigned long>::max() );
00183 itkGetConstMacro( NumberOfHistogramBins, unsigned long);
00184
00185 protected:
00186
00187 MattesMutualInformationImageToImageMetric();
00188 virtual ~MattesMutualInformationImageToImageMetric() {};
00189 void PrintSelf(std::ostream& os, Indent indent) const;
00190
00194 class FixedImageSpatialSample
00195 {
00196 public:
00197 FixedImageSpatialSample():FixedImageValue(0.0)
00198 { FixedImagePointValue.Fill(0.0); }
00199 ~FixedImageSpatialSample() {};
00200
00201 FixedImagePointType FixedImagePointValue;
00202 double FixedImageValue;
00203 };
00204
00206 typedef std::vector<FixedImageSpatialSample>
00207 FixedImageSpatialSampleContainer;
00208
00210 FixedImageSpatialSampleContainer m_FixedImageSamples;
00211
00213 virtual void SampleFixedImageDomain(
00214 FixedImageSpatialSampleContainer& samples);
00215
00218 virtual void TransformPoint( const FixedImagePointType& fixedImagePoint,
00219 MovingImagePointType& mappedPoint, bool& sampleWithinSupportRegion,
00220 double& movingImageValue ) const;
00221
00222 private:
00223
00224 MattesMutualInformationImageToImageMetric(const Self&);
00225 void operator=(const Self&);
00226
00227
00229 typedef float PDFValueType;
00230 typedef std::vector<PDFValueType> MarginalPDFType;
00231
00233 mutable MarginalPDFType m_FixedImageMarginalPDF;
00234
00236 mutable MarginalPDFType m_MovingImageMarginalPDF;
00237
00239 typedef Image<PDFValueType,2> JointPDFType;
00240 typedef Image<PDFValueType,3> JointPDFDerivativesType;
00241 typedef JointPDFType::IndexType JointPDFIndexType;
00242 typedef JointPDFType::PixelType JointPDFValueType;
00243 typedef JointPDFType::RegionType JointPDFRegionType;
00244 typedef JointPDFType::SizeType JointPDFSizeType;
00245 typedef JointPDFDerivativesType::IndexType JointPDFDerivativesIndexType;
00246 typedef JointPDFDerivativesType::PixelType JointPDFDerivativesValueType;
00247 typedef JointPDFDerivativesType::RegionType JointPDFDerivativesRegionType;
00248 typedef JointPDFDerivativesType::SizeType JointPDFDerivativesSizeType;
00249
00251 typename JointPDFType::Pointer m_JointPDF;
00252 typename JointPDFDerivativesType::Pointer m_JointPDFDerivatives;
00253
00254 unsigned long m_NumberOfSpatialSamples;
00255 unsigned long m_NumberOfParameters;
00256
00258 unsigned long m_NumberOfHistogramBins;
00259 double m_MovingImageNormalizedMin;
00260 double m_FixedImageNormalizedMin;
00261 double m_MovingImageTrueMin;
00262 double m_MovingImageTrueMax;
00263 double m_FixedImageBinSize;
00264 double m_MovingImageBinSize;
00265
00267 typedef BSplineKernelFunction<3> CubicBSplineFunctionType;
00268 typedef BSplineDerivativeKernelFunction<3>
00269 CubicBSplineDerivativeFunctionType;
00270
00272 typename CubicBSplineFunctionType::Pointer m_CubicBSplineKernel;
00273 typename CubicBSplineDerivativeFunctionType::Pointer
00274 m_CubicBSplineDerivativeKernel;
00275
00282 typedef CovariantVector< double,
00283 itkGetStaticConstMacro(MovingImageDimension) > ImageDerivativesType;
00284
00286 virtual void ComputeImageDerivatives( const MovingImagePointType& mappedPoint,
00287 ImageDerivativesType& gradient ) const;
00288
00290 bool m_InterpolatorIsBSpline;
00291
00293 typedef
00294 BSplineInterpolateImageFunction<MovingImageType,
00295 CoordinateRepresentationType> BSplineInterpolatorType;
00296
00298 typename BSplineInterpolatorType::Pointer m_BSplineInterpolator;
00299
00301 typedef CentralDifferenceImageFunction<MovingImageType,
00302 CoordinateRepresentationType> DerivativeFunctionType;
00303
00305 typename DerivativeFunctionType::Pointer m_DerivativeCalculator;
00306
00307
00309 virtual void ComputePDFDerivatives( const FixedImagePointType& fixedImagePoint,
00310 int fixedImageParzenWindowIndex, int movingImageParzenWindowIndex,
00311 const ImageDerivativesType& movingImageGradientValue,
00312 double cubicBSplineDerivativeValue ) const;
00313
00323 bool m_TransformIsBSpline;
00324
00326 long m_NumParametersPerDim;
00327
00331 unsigned long m_NumBSplineWeights;
00332
00334 itkStaticConstMacro( FixedImageDimension, unsigned int,
00335 FixedImageType::ImageDimension );
00336
00340 enum { DeformationSplineOrder = 3 };
00341
00345 typedef BSplineDeformableTransform<
00346 CoordinateRepresentationType,
00347 ::itk::GetImageDimension<FixedImageType>::ImageDimension,
00348 DeformationSplineOrder> BSplineTransformType;
00349 typedef typename BSplineTransformType::WeightsType
00350 BSplineTransformWeightsType;
00351 typedef typename BSplineTransformType::ParameterIndexArrayType
00352 BSplineTransformIndexArrayType;
00353
00357 typename BSplineTransformType::Pointer m_BSplineTransform;
00358 mutable BSplineTransformWeightsType m_BSplineTransformWeights;
00359 mutable BSplineTransformIndexArrayType m_BSplineTransformIndices;
00360
00361 };
00362
00363 }
00364
00365 #ifndef ITK_MANUAL_INSTANTIATION
00366 #include "itkMattesMutualInformationImageToImageMetric.txx"
00367 #endif
00368
00369 #endif
00370