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