00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _itkPDEDeformableRegistrationFilter_h_
00018 #define _itkPDEDeformableRegistrationFilter_h_
00019
00020 #include "itkDenseFiniteDifferenceImageFilter.h"
00021 #include "itkPDEDeformableRegistrationFunction.h"
00022
00023 namespace itk {
00024
00065 template<class TFixedImage, class TMovingImage, class TDeformationField>
00066 class ITK_EXPORT PDEDeformableRegistrationFilter :
00067 public DenseFiniteDifferenceImageFilter<TDeformationField,TDeformationField>
00068 {
00069 public:
00071 typedef PDEDeformableRegistrationFilter Self;
00072 typedef DenseFiniteDifferenceImageFilter<
00073 TDeformationField,TDeformationField> Superclass;
00074 typedef SmartPointer<Self> Pointer;
00075 typedef SmartPointer<const Self> ConstPointer;
00076
00078 itkNewMacro(Self);
00079
00081 itkTypeMacro( PDEDeformableRegistrationFilter,
00082 DenseFiniteDifferenceImageFilter );
00083
00085 typedef TFixedImage FixedImageType;
00086 typedef typename FixedImageType::Pointer FixedImagePointer;
00087 typedef typename FixedImageType::ConstPointer FixedImageConstPointer;
00088
00090 typedef TMovingImage MovingImageType;
00091 typedef typename MovingImageType::Pointer MovingImagePointer;
00092 typedef typename MovingImageType::ConstPointer MovingImageConstPointer;
00093
00095 typedef TDeformationField DeformationFieldType;
00096 typedef typename DeformationFieldType::Pointer DeformationFieldPointer;
00097
00099 typedef typename Superclass::OutputImageType OutputImageType;
00100
00102 typedef typename Superclass::FiniteDifferenceFunctionType
00103 FiniteDifferenceFunctionType;
00104
00106 typedef PDEDeformableRegistrationFunction<FixedImageType,MovingImageType,
00107 DeformationFieldType> PDEDeformableRegistrationFunctionType;
00108
00110 itkStaticConstMacro(ImageDimension, unsigned int,
00111 Superclass::ImageDimension);
00112
00114 void SetFixedImage( const FixedImageType * ptr );
00115
00117 const FixedImageType * GetFixedImage(void);
00118
00120 void SetMovingImage( const MovingImageType * ptr );
00121
00123 const MovingImageType * GetMovingImage(void);
00124
00126 void SetInitialDeformationField( DeformationFieldType * ptr )
00127 { this->SetInput( ptr ); }
00128
00130 DeformationFieldType * GetDeformationField()
00131 { return this->GetOutput(); }
00132
00135 itkSetVectorMacro( StandardDeviations, double, ImageDimension );
00136 virtual void SetStandardDeviations( double value );
00137
00139 const double * GetStandardDeviations(void)
00140 { return (double *) m_StandardDeviations; }
00141
00142 protected:
00143 PDEDeformableRegistrationFilter();
00144 ~PDEDeformableRegistrationFilter() {}
00145 void PrintSelf(std::ostream& os, Indent indent) const;
00146
00149 virtual bool Halt()
00150 {
00151 if (this->GetElapsedIterations() == this->GetNumberOfIterations() ) return true;
00152 else return false;
00153 }
00154
00157 virtual void CopyInputToOutput();
00158
00161 virtual void InitializeIteration();
00162
00166 virtual void SmoothDeformationField();
00167
00170 virtual void CopyDeformationField( DeformationFieldType * input,
00171 DeformationFieldType * output );
00172
00177 virtual void GenerateOutputInformation();
00178
00185 virtual void GenerateInputRequestedRegion();
00186
00187 private:
00188 PDEDeformableRegistrationFilter(const Self&);
00189 void operator=(const Self&);
00190
00192 double m_StandardDeviations[ImageDimension];
00193
00196 DeformationFieldPointer m_TempField;
00197
00199 double m_MaximumError;
00200
00201 };
00202
00203
00204 }
00205
00206 #ifndef ITK_MANUAL_INSTANTIATION
00207 #include "itkPDEDeformableRegistrationFilter.txx"
00208 #endif
00209
00210 #endif