/vol/vipdata/irtk/packages/registration/include/irtkMultipleImageFreeFormRegistration.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _IRTKMULTIPLEIMAGEFREEFORMREGISTRATION_H
00014
00015 #define _IRTKMULTIPLEIMAGEFREEFORMREGISTRATION_H
00016
00017 #ifdef HAS_TBB
00018
00019 class irtkMultiThreadedImageFreeFormRegistrationEvaluate;
00020 class irtkMultiThreadedImageFreeFormRegistrationEvaluateGradient;
00021
00022 #endif
00023
00033 class irtkMultipleImageFreeFormRegistration : public irtkMultipleImageRegistration
00034 {
00035
00036 #ifdef HAS_TBB
00037
00038 friend class irtkMultiThreadedImageFreeFormRegistrationEvaluate;
00039 friend class irtkMultiThreadedImageFreeFormRegistrationEvaluateGradient;
00040
00041 #endif
00042
00044 friend float irtkFreeFormRegistration_Ptr2NRfunc (float *x);
00045
00047 friend void irtkFreeFormRegistration_Ptr2NRdfunc(float *x, float *dx);
00048
00049 protected:
00050
00052 irtkBSplineFreeFormTransformation *_affd;
00053
00055 irtkMultiLevelFreeFormTransformation *_mffd;
00056
00058 irtkSimilarityMetric *_tmpMetricA, *_tmpMetricB;
00059
00063 float **_mffdLookupTable;
00064
00068 float **_affdLookupTable;
00069
00072 float *_localLookupTable;
00073
00075 double _Lambda1;
00076
00078 double _Lambda2;
00079
00081 double _Lambda3;
00082
00084 double _DX;
00085
00087 double _DY;
00088
00090 double _DZ;
00091
00093 Bool _Subdivision;
00094
00096 double _SpeedupFactor;
00097
00099 virtual void Initialize();
00100
00102 virtual void Initialize(int);
00103
00105 virtual void Finalize();
00106
00108 virtual void Finalize(int);
00109
00111 virtual double SmoothnessPenalty();
00112
00114 virtual double SmoothnessPenalty(int);
00115
00117 virtual double VolumePreservationPenalty();
00118
00120 virtual double VolumePreservationPenalty(int);
00121
00123 virtual double TopologyPreservationPenalty();
00124
00126 virtual double TopologyPreservationPenalty(int);
00127
00133 virtual double Evaluate();
00134
00142 virtual double EvaluateDerivative(int, double);
00143
00153 virtual double EvaluateGradient(float, float *);
00154
00156 virtual void UpdateLUT();
00157
00158 public:
00159
00161 irtkMultipleImageFreeFormRegistration();
00162
00164 virtual void SetOutput(irtkTransformation *);
00165
00167 virtual const char *NameOfClass();
00168
00170 virtual void Print();
00171
00173 virtual void GuessParameter();
00174
00176 virtual Bool Read(char *, char *, int &);
00177
00179 virtual void Write(ostream &);
00180
00181
00182 virtual SetMacro(DX, double);
00183 virtual GetMacro(DX, double);
00184 virtual SetMacro(DY, double);
00185 virtual GetMacro(DY, double);
00186 virtual SetMacro(DZ, double);
00187 virtual GetMacro(DZ, double);
00188 virtual SetMacro(SpeedupFactor, double);
00189 virtual GetMacro(SpeedupFactor, double);
00190
00191 };
00192
00193 inline void irtkMultipleImageFreeFormRegistration::SetOutput(irtkTransformation *transformation)
00194 {
00195
00196 this->Debug("irtkMultipleImageFreeFormRegistration::SetOutput");
00197
00198 if (strcmp(transformation->NameOfClass(),
00199 "irtkMultiLevelFreeFormTransformation") != 0) {
00200 cerr << "irtkMultipleImageFreeFormRegistration::SetOutput: Transformation must be "
00201 << "irtkMultiLevelFreeFormTransformation" << endl;
00202 exit(0);
00203 }
00204 _transformation = transformation;
00205 }
00206
00207 inline const char *irtkMultipleImageFreeFormRegistration::NameOfClass()
00208 {
00209 return "irtkFreeFormRegistration";
00210 }
00211
00212 inline void irtkMultipleImageFreeFormRegistration::Print()
00213 {}
00214
00215 #endif
00216