/*========================================================================= This code provided as part of Brooks, R., Arbel, T. "Improving the OrientedImage class for use in the Registration Framework", Insight Journal, October, 2007 Author: Rupert Brooks Institution: Centre for Intelligent Machines, McGill University Sole differences from itkMeanSquaresImageToImageMetric are the derivative calculation. =========================================================================*/ #ifndef __itkMeanSquaresModImageToImageMetric_h #define __itkMeanSquaresModImageToImageMetric_h #include "itkModImageToImageMetric.h" #include "itkCovariantVector.h" #include "itkPoint.h" namespace itk { /** \class MeanSquaresModImageToImageMetric * \brief Computes similarity between two objects to be registered * * This Class is templated over the type of the fixed and moving * images to be compared. * * This metric computes the sum of squared differenced between pixels in * the moving image and pixels in the fixed image. The spatial correspondance * between both images is established through a Transform. Pixel values are * taken from the Moving image. Their positions are mapped to the Fixed image * and result in general in non-grid position on it. Values at these non-grid * position of the Fixed image are interpolated using a user-selected Interpolator. * * \ingroup RegistrationMetrics */ template < class TFixedImage, class TMovingImage > class ITK_EXPORT MeanSquaresModImageToImageMetric : public ModImageToImageMetric< TFixedImage, TMovingImage> { public: /** Standard class typedefs. */ typedef MeanSquaresModImageToImageMetric Self; typedef ModImageToImageMetric Superclass; typedef SmartPointer Pointer; typedef SmartPointer ConstPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); /** Run-time type information (and related methods). */ itkTypeMacro(MeanSquaresModImageToImageMetric, ModImageToImageMetric); /** Types transferred from the base class */ typedef typename Superclass::RealType RealType; typedef typename Superclass::TransformType TransformType; typedef typename Superclass::TransformPointer TransformPointer; typedef typename Superclass::TransformParametersType TransformParametersType; typedef typename Superclass::TransformJacobianType TransformJacobianType; typedef typename Superclass::GradientPixelType GradientPixelType; typedef typename Superclass::MeasureType MeasureType; typedef typename Superclass::DerivativeType DerivativeType; typedef typename Superclass::FixedImageType FixedImageType; typedef typename Superclass::MovingImageType MovingImageType; typedef typename Superclass::FixedImageConstPointer FixedImageConstPointer; typedef typename Superclass::MovingImageConstPointer MovingImageConstPointer; /** Get the derivatives of the match measure. */ void GetDerivative( const TransformParametersType & parameters, DerivativeType & derivative ) const; /** Get the value for single valued optimizers. */ MeasureType GetValue( const TransformParametersType & parameters ) const; /** Get value and derivatives for multiple valued optimizers. */ void GetValueAndDerivative( const TransformParametersType & parameters, MeasureType& Value, DerivativeType& Derivative ) const; #ifdef ITK_USE_CONCEPT_CHECKING /** Begin concept checking */ itkConceptMacro(MovingPixelTypeHasNumericTraitsCheck, (Concept::HasNumericTraits)); itkConceptMacro(MovingRealTypeAdditivieOperatorsCheck, (Concept::AdditiveOperators< typename NumericTraits::RealType>)); itkConceptMacro(MovingRealTypeMultiplyOperatorCheck, (Concept::MultiplyOperator< typename NumericTraits::RealType>)); /** End concept checking */ #endif protected: MeanSquaresModImageToImageMetric(); virtual ~MeanSquaresModImageToImageMetric() {}; private: MeanSquaresModImageToImageMetric(const Self&); //purposely not implemented void operator=(const Self&); //purposely not implemented }; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION #include "itkMeanSquaresModImageToImageMetric.txx" #endif #endif