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

00001 /*=========================================================================
00002 
00003   Library   : Image Registration Toolkit (IRTK)
00004   Module    : $Id: irtkMultipleImageFreeFormRegistration.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 _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   // Access parameters for control point space
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   // Print debugging information
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