00001 /*========================================================================= 00002 00003 Library : Image Registration Toolkit (IRTK) 00004 Module : $Id: irtkImageFluidRegistration.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 _IRTKIMAGEFLUIDREGISTRATION_H 00014 00015 #define _IRTKIMAGEFLUIDREGISTRATION_H 00016 00023 class irtkImageFluidRegistration : public irtkImageRegistration 00024 { 00025 00027 friend float irtkFluidRegistration_Ptr2NRfunc (float *x); 00028 00030 friend void irtkFluidRegistration_Ptr2NRdfunc(float *x, float *dx); 00031 00032 protected: 00033 00035 irtkBSplineFreeFormTransformation *_affd; 00036 00038 irtkFluidFreeFormTransformation *_mffd; 00039 00041 double _DX; 00042 00044 double _DY; 00045 00047 double _DZ; 00048 00050 int _NumberOfTimeSteps; 00051 00053 double _SpeedupFactor; 00054 00056 virtual void Initialize(); 00057 00059 virtual void Initialize(int); 00060 00062 virtual void Finalize(); 00063 00065 virtual void Finalize(int); 00066 00072 virtual double Evaluate(); 00073 00081 virtual double EvaluateDerivative(int, double); 00082 00092 virtual double EvaluateGradient(float, float *); 00093 00094 virtual void UpdateLUT(); 00095 00096 public: 00097 00099 irtkImageFluidRegistration(); 00100 00102 virtual void SetOutput(irtkTransformation *); 00103 00105 virtual void Run(); 00106 00108 virtual const char *NameOfClass(); 00109 00111 virtual void Print(); 00112 00114 virtual void GuessParameter(); 00115 00117 virtual Bool Read(char *, char *, int &); 00118 00120 virtual void Write(ostream &); 00121 00122 }; 00123 00124 inline void irtkImageFluidRegistration::SetOutput(irtkTransformation *transformation) 00125 { 00126 // Print debugging information 00127 this->Debug("irtkImageFluidRegistration::SetOutput"); 00128 00129 if (strcmp(transformation->NameOfClass(), 00130 "irtkFluidFreeFormTransformation") != 0) { 00131 cerr << "irtkImageFluidRegistration::SetOutput: Transformation must be " 00132 << "irtkFluidFreeFormTransformation" << endl; 00133 exit(0); 00134 } 00135 _transformation = transformation; 00136 } 00137 00138 inline const char *irtkImageFluidRegistration::NameOfClass() 00139 { 00140 return "irtkImageFluidRegistration"; 00141 } 00142 00143 inline void irtkImageFluidRegistration::Print() 00144 { 00145 } 00146 00147 #endif