00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkGradientDifferenceImageToImageMetric_h
00018 #define __itkGradientDifferenceImageToImageMetric_h
00019
00020 #include "itkImageToImageMetric.h"
00021
00022 #include "itkPoint.h"
00023 #include "itkCastImageFilter.h"
00024 #include "itkResampleImageFilter.h"
00025 #include "itkSobelOperator.h"
00026 #include "itkNeighborhoodOperatorImageFilter.h"
00027
00028
00029 namespace itk
00030 {
00049 template < class TFixedImage, class TMovingImage >
00050 class ITK_EXPORT GradientDifferenceImageToImageMetric :
00051 public ImageToImageMetric< TFixedImage, TMovingImage>
00052 {
00053 public:
00054
00056 typedef GradientDifferenceImageToImageMetric Self;
00057 typedef ImageToImageMetric<TFixedImage, TMovingImage > Superclass;
00058
00059 typedef SmartPointer<Self> Pointer;
00060 typedef SmartPointer<const Self> ConstPointer;
00061
00063 itkNewMacro(Self);
00064
00066 itkTypeMacro(GradientDifferenceImageToImageMetric, ImageToImageMetric);
00067
00068
00070 typedef typename Superclass::RealType RealType;
00071 typedef typename Superclass::TransformType TransformType;
00072 typedef typename Superclass::TransformPointer TransformPointer;
00073 typedef typename Superclass::TransformParametersType TransformParametersType;
00074 typedef typename Superclass::TransformJacobianType TransformJacobianType;
00075
00076 typedef typename Superclass::MeasureType MeasureType;
00077 typedef typename Superclass::DerivativeType DerivativeType;
00078 typedef typename Superclass::FixedImageType FixedImageType;
00079 typedef typename Superclass::MovingImageType MovingImageType;
00080 typedef typename Superclass::FixedImageConstPointer FixedImageConstPointer;
00081 typedef typename Superclass::MovingImageConstPointer MovingImageConstPointer;
00082
00083 typedef typename TFixedImage::PixelType FixedImagePixelType;
00084 typedef typename TMovingImage::PixelType MovedImagePixelType;
00085
00086 itkStaticConstMacro(FixedImageDimension, unsigned int, TFixedImage::ImageDimension);
00088 typedef itk::Image< FixedImagePixelType,
00089 itkGetStaticConstMacro( FixedImageDimension ) >
00090 TransformedMovingImageType;
00091
00092 typedef itk::ResampleImageFilter< MovingImageType, TransformedMovingImageType >
00093 TransformMovingImageFilterType;
00094
00097 typedef itk::Image< RealType,
00098 itkGetStaticConstMacro( FixedImageDimension ) >
00099 FixedGradientImageType;
00100
00101 typedef itk::CastImageFilter< FixedImageType, FixedGradientImageType >
00102 CastFixedImageFilterType;
00103
00104 typedef typename FixedGradientImageType::PixelType FixedGradientPixelType;
00105
00106
00109 itkStaticConstMacro( MovedImageDimension, unsigned int,
00110 MovingImageType::ImageDimension );
00111
00112 typedef itk::Image< RealType,
00113 itkGetStaticConstMacro( MovedImageDimension ) >
00114 MovedGradientImageType;
00115
00116 typedef itk::CastImageFilter< TransformedMovingImageType, MovedGradientImageType >
00117 CastMovedImageFilterType;
00118
00119 typedef typename MovedGradientImageType::PixelType MovedGradientPixelType;
00120
00121
00122 #if 0
00123
00124 itkGetConstObjectMacro( FixedGradientImage, FixedGradientImageType::Pointer );
00126 itkGetConstObjectMacro( MovedGradientImage, MovedGradientImageType::Pointer );
00127 #endif
00128
00130 void GetDerivative( const TransformParametersType & parameters,
00131 DerivativeType & derivative ) const;
00132
00134 MeasureType GetValue( const TransformParametersType & parameters ) const;
00135
00137 void GetValueAndDerivative( const TransformParametersType & parameters,
00138 MeasureType& Value, DerivativeType& derivative ) const;
00139
00142 virtual void Initialize(void) throw ( ExceptionObject );
00143
00145 void WriteGradientImagesToFiles(void) const;
00146
00147 protected:
00148 GradientDifferenceImageToImageMetric();
00149 virtual ~GradientDifferenceImageToImageMetric() {};
00150 void PrintSelf(std::ostream& os, Indent indent) const;
00151
00153 void ComputeMovedGradientRange( void ) const;
00154
00156 void ComputeVariance( void ) const;
00157
00159 MeasureType ComputeMeasure( const TransformParametersType ¶meters,
00160 const double *subtractionFactor ) const;
00161
00162 typedef NeighborhoodOperatorImageFilter<
00163 FixedGradientImageType, FixedGradientImageType > FixedSobelFilter;
00164
00165 typedef NeighborhoodOperatorImageFilter<
00166 MovedGradientImageType, MovedGradientImageType > MovedSobelFilter;
00167
00168 private:
00169 GradientDifferenceImageToImageMetric(const Self&);
00170 void operator=(const Self&);
00171
00173 mutable MovedGradientPixelType m_Variance[FixedImageDimension];
00174
00176 mutable MovedGradientPixelType m_MinMovedGradient[MovedImageDimension];
00177 mutable MovedGradientPixelType m_MaxMovedGradient[MovedImageDimension];
00179 mutable FixedGradientPixelType m_MinFixedGradient[FixedImageDimension];
00180 mutable FixedGradientPixelType m_MaxFixedGradient[FixedImageDimension];
00181
00183 typename TransformMovingImageFilterType::Pointer m_TransformMovingImageFilter;
00184
00187 typename TransformedMovingImageType::Pointer m_MovedImage;
00188
00190 typename FixedGradientImageType::Pointer
00191 m_FixedGradientImage[itkGetStaticConstMacro( FixedImageDimension )];
00192
00194 typename MovedGradientImageType::Pointer
00195 m_MovedGradientImage[itkGetStaticConstMacro( MovedImageDimension )];
00196
00197
00199 CastFixedImageFilterType m_CastFixedImageFilter;
00200
00201 SobelOperator< FixedGradientPixelType,
00202 itkGetStaticConstMacro(FixedImageDimension) >
00203 m_FixedSobelOperators[FixedImageDimension];
00204 FixedSobelFilter m_FixedSobelFilters[FixedImageDimension];
00205
00206
00208 CastMovedImageFilterType m_CastMovedImageFilter;
00209
00210 SobelOperator< MovedGradientPixelType,
00211 itkGetStaticConstMacro(MovedImageDimension) >
00212 m_MovedSobelOperators[MovedImageDimension];
00213 MovedSobelFilter m_MovedSobelFilters[MovedImageDimension];
00214
00215 };
00216
00217 }
00218
00219 #ifndef ITK_MANUAL_INSTANTIATION
00220 #include "itkGradientDifferenceImageToImageMetric.txx"
00221 #endif
00222
00223 #endif
00224
00225
00226