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