/vol/vipdata/irtk/packages/registration/include/irtkSymmetricImageFreeFormRegistration.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _IRTKSYMMETRICIMAGEFREEFORMREGISTRATION_H
00014
00015 #define _IRTKSYMMETRICIMAGEFREEFORMREGISTRATION_H
00016
00026 class irtkSymmetricImageFreeFormRegistration : public irtkSymmetricImageRegistration
00027 {
00028
00030 friend float irtkFreeFormRegistration_Ptr2NRfunc (float *x);
00031
00033 friend void irtkFreeFormRegistration_Ptr2NRdfunc(float *x, float *dx);
00034
00035 protected:
00036
00038 irtkBSplineFreeFormTransformation *_affd1;
00039 irtkBSplineFreeFormTransformation *_affd2;
00040
00042 irtkMultiLevelFreeFormTransformation *_mffd1;
00043 irtkMultiLevelFreeFormTransformation *_mffd2;
00044
00046 irtkSimilarityMetric *_tmp1MetricA, *_tmp1MetricB;
00047 irtkSimilarityMetric *_tmp2MetricA, *_tmp2MetricB;
00048
00052 float *_mffdLookupTable1;
00053 float *_mffdLookupTable2;
00054
00058 float *_affdLookupTable1;
00059 float *_affdLookupTable2;
00060
00063 float *_localLookupTable;
00064
00066 double _Lambda1;
00067
00069 double _Lambda2;
00070
00072 double _Lambda3;
00073
00075 double _Lambda4;
00076
00078 double _DX;
00079
00081 double _DY;
00082
00084 double _DZ;
00085
00087 Bool _Subdivision;
00088
00090 double _SpeedupFactor;
00091
00093 virtual void Initialize();
00094
00096 virtual void Initialize(int);
00097
00099 virtual void Finalize();
00100
00102 virtual void Finalize(int);
00103
00105 virtual double SmoothnessPenalty();
00106
00108 virtual double SmoothnessPenalty(int);
00109
00111 virtual double VolumePreservationPenalty();
00112
00114 virtual double VolumePreservationPenalty(int);
00115
00117 virtual double TopologyPreservationPenalty();
00118
00120 virtual double TopologyPreservationPenalty(int);
00121
00123 virtual double InverseConsistencyPenalty();
00124
00126 virtual double InverseConsistencyPenalty(int);
00127
00133 virtual double Evaluate();
00134
00142 virtual double EvaluateDerivative1(int, double);
00143 virtual double EvaluateDerivative2(int, double);
00144
00154 virtual double EvaluateGradient(float, float *);
00155
00157 virtual void UpdateLUT();
00158
00159 public:
00160
00162 irtkSymmetricImageFreeFormRegistration();
00163
00165 virtual void SetOutput(irtkTransformation *, irtkTransformation *);
00166
00168 virtual const char *NameOfClass();
00169
00171 virtual void Print();
00172
00174 virtual void GuessParameter();
00175
00177 virtual Bool Read(char *, char *, int &);
00178
00180 virtual void Write(ostream &);
00181
00182
00183 virtual SetMacro(DX, double);
00184 virtual GetMacro(DX, double);
00185 virtual SetMacro(DY, double);
00186 virtual GetMacro(DY, double);
00187 virtual SetMacro(DZ, double);
00188 virtual GetMacro(DZ, double);
00189 virtual SetMacro(SpeedupFactor, double);
00190 virtual GetMacro(SpeedupFactor, double);
00191 };
00192
00193 inline void irtkSymmetricImageFreeFormRegistration::SetOutput(irtkTransformation *transformation1,
00194 irtkTransformation *transformation2)
00195 {
00196
00197 this->Debug("irtkSymmetricImageFreeFormRegistration::SetOutput");
00198
00199 if (strcmp(transformation1->NameOfClass(),
00200 "irtkMultiLevelFreeFormTransformation") != 0) {
00201 cerr << "irtkSymmetricImageFreeFormRegistration::SetOutput: Transformation must be "
00202 << "irtkMultiLevelFreeFormTransformation" << endl;
00203 exit(0);
00204 }
00205 if (strcmp(transformation2->NameOfClass(),
00206 "irtkMultiLevelFreeFormTransformation") != 0) {
00207 cerr << "irtkSymmetricImageFreeFormRegistration::SetOutput: Transformation must be "
00208 << "irtkMultiLevelFreeFormTransformation" << endl;
00209 exit(0);
00210 }
00211 _transformation1 = transformation1;
00212 _transformation2 = transformation2;
00213 }
00214
00215 inline const char *irtkSymmetricImageFreeFormRegistration::NameOfClass()
00216 {
00217 return "irtkFreeFormRegistration";
00218 }
00219
00220 inline void irtkSymmetricImageFreeFormRegistration::Print()
00221 {}
00222
00223 #endif