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
00134
itkSetMacro(NumberOfIterations,
unsigned int);
00135
00137
itkGetMacro(NumberOfIterations,
unsigned int);
00138
00141
itkSetVectorMacro( StandardDeviations,
double, ImageDimension );
00142
virtual void SetStandardDeviations(
double value );
00143
00145
const double * GetStandardDeviations(
void)
00146 {
return (
double *) m_StandardDeviations; }
00147
00148
protected:
00149 PDEDeformableRegistrationFilter();
00150 ~PDEDeformableRegistrationFilter() {}
00151
void PrintSelf(std::ostream& os,
Indent indent)
const;
00152
00155
virtual bool Halt()
00156 {
00157 if (this->GetElapsedIterations() == m_NumberOfIterations)
return true;
00158
else return false;
00159 }
00160
00163
virtual void CopyInputToOutput();
00164
00167
virtual void InitializeIteration();
00168
00172
virtual void SmoothDeformationField();
00173
00176
virtual void CopyDeformationField( DeformationFieldType * input,
00177 DeformationFieldType * output );
00178
00183
virtual void GenerateOutputInformation();
00184
00191
virtual void GenerateInputRequestedRegion();
00192
00193
private:
00194 PDEDeformableRegistrationFilter(
const Self&);
00195
void operator=(
const Self&);
00196
00198
unsigned int m_NumberOfIterations;
00199
00201
double m_StandardDeviations[ImageDimension];
00202
00205 DeformationFieldPointer m_TempField;
00206
00208
double m_MaximumError;
00209
00210 };
00211
00212
00213 }
00214
00215
#ifndef ITK_MANUAL_INSTANTIATION
00216
#include "itkPDEDeformableRegistrationFilter.txx"
00217
#endif
00218
00219
#endif