/vol/vipdata/irtk/packages/registration/include/irtkSymmetricImageFreeFormRegistration.h

00001 /*=========================================================================
00002 
00003   Library   : Image Registration Toolkit (IRTK)
00004   Module    : $Id: irtkSymmetricImageFreeFormRegistration.h 2 2008-12-23 12:40:14Z dr $
00005   Copyright : Imperial College, Department of Computing
00006               Visual Information Processing (VIP), 2008 onwards
00007   Date      : $Date: 2008-12-23 12:40:14 +0000 (Tue, 23 Dec 2008) $
00008   Version   : $Revision: 2 $
00009   Changes   : $Author: dr $
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   // Access parameters for control point space
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   // Print debugging information
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