SIRF  3.4.0
BSplineTransformation.h
1 // ====================================================================================================
2 //
3 // niftyMoMo: An implementation of the generalised motion modelling and image registration framework
4 //
5 // Copyright (c) University College London (UCL). All rights reserved.
6 //
7 // This software is distributed WITHOUT ANY WARRANTY; without even
8 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
9 // PURPOSE.
10 //
11 // See LICENSE.txt in the top level directory for details.
12 //
13 // ====================================================================================================
14 
15 
16 
17 #pragma once
18 
19 #include "_reg_localTrans.h"
20 #include "_reg_resampling.h"
21 #include "nifti1_io.h"
22 #include "Transformation.h"
23 
24 namespace NiftyMoMo {
25 
26 template<class DTYPE>
27 inline void get_BSplineBasisValues( DTYPE basis, DTYPE *values )
28 {
29  DTYPE FF = basis*basis;
30  DTYPE FFF = FF*basis;
31  DTYPE MF = static_cast<DTYPE>(1.0 - basis);
32  values[0] = static_cast<DTYPE>((MF) *(MF) *(MF) / (6.0));
33  values[1] = static_cast<DTYPE>((3.0*FFF - 6.0*FF + 4.0) / 6.0);
34  values[2] = static_cast<DTYPE>((-3.0*FFF + 3.0*FF + 3.0*basis + 1.0) / 6.0);
35  values[3] = static_cast<DTYPE>(FFF / 6.0);
36 }
37 
38 
42 {
43 public:
44  typedef Transformation::PrecisionType PrecisionType;
45 
54  BSplineTransformation( nifti_image* referenceImageIn,
55  unsigned int numberOfLevelsToPerform,
56  float* finalControlPointGridSpacing );
57 
61  BSplineTransformation( const BSplineTransformation& transformToCopy );
62 
63 
67 
73  virtual void InitialiseLevel( unsigned int level );
74 
79  void SetParameters( PrecisionType* paramsIn, bool parametersAreDisplacements );
80 
84  virtual nifti_image* GetDeformationVectorField(const nifti_image * const targetImageIn );
85 
90  virtual BSplineTransformation::PrecisionType* GetDVFGradientWRTTransformationParameters( nifti_image* denseDVFIn );
91 
94  virtual BSplineTransformation::PrecisionType* GetConstraintGradientWRTTransformationParameters();
95 
98  double GetConstraintValue();
99 
102  virtual PrecisionType* GetParameters();
103 
106  virtual unsigned int GetNumberOfParameters();
107 
111  void SetLinearEnergyWeight( double linearEnergyWeightIn );
112 
116  void SetBendingEnergyWeight( double bendingEnergyWeightIn );
117 
120  std::shared_ptr<Transformation> DeepCopy();
121 
125 
130  virtual PrecisionType GetSumOfPenaltyWeights();
131 
134  virtual PrecisionType GetMaxTransformationParameterLength( PrecisionType* parametersIn );
135 
136 
139  nifti_image* GetTransformationAsImage();
140 
141 protected:
142 
147  void CPGToDVF2D( nifti_image *denseVectorFieldImage );
148 
153  void CPGToDVF3D( nifti_image *denseVectorFieldImage );
154 
162  void DVFToCPG2D( nifti_image *controlPointGridImage,
163  nifti_image *denseVectorFieldImage,
164  bool normaliseKernel );
165 
173  void DVFToCPG3D( nifti_image *controlPointGridImage,
174  nifti_image *denseVectorFieldImage,
175  bool normaliseKernel );
176 
177 
179  // * Vectors which are stored along the 5th (u) dimension will be reoriented
180  // * \param vectorFieldToReorientate Vector image to be reorientated
181  // * \param reorientationMatrix 4 x 4 Matrix used to reorientate vectors
182  // */
183  //void ReorientateVectorImage( nifti_image* vectorFieldToReorientate, mat44 reorientationMatrix );
184 
185  nifti_image* controlPointGridImage;
188 
189 private:
190  int lastInitialisedLevel;
191 };
192 
193 }
void SetParameters(PrecisionType *paramsIn, bool parametersAreDisplacements)
Definition: BSplineTransformation.cpp:1410
Definition: NiftyResample.h:39
virtual nifti_image * GetDeformationVectorField(const nifti_image *const targetImageIn)
Definition: BSplineTransformation.cpp:252
~BSplineTransformation()
Definition: BSplineTransformation.cpp:144
void DisplayTransformationParameters()
Definition: BSplineTransformation.cpp:1556
double linearEnergyWeight
The linear energy weight.
Definition: BSplineTransformation.h:187
std::shared_ptr< Transformation > DeepCopy()
Definition: BSplineTransformation.cpp:1540
Definition: BSplineTransformation.h:41
virtual void InitialiseLevel(unsigned int level)
Definition: BSplineTransformation.cpp:203
BSplineTransformation(nifti_image *referenceImageIn, unsigned int numberOfLevelsToPerform, float *finalControlPointGridSpacing)
Definition: BSplineTransformation.cpp:85
void SetLinearEnergyWeight(double linearEnergyWeightIn)
Definition: BSplineTransformation.cpp:1386
virtual PrecisionType * GetParameters()
Definition: BSplineTransformation.cpp:173
void DVFToCPG3D(nifti_image *controlPointGridImage, nifti_image *denseVectorFieldImage, bool normaliseKernel)
Definition: BSplineTransformation.cpp:916
virtual BSplineTransformation::PrecisionType * GetDVFGradientWRTTransformationParameters(nifti_image *denseDVFIn)
Definition: BSplineTransformation.cpp:1340
void CPGToDVF3D(nifti_image *denseVectorFieldImage)
Definition: BSplineTransformation.cpp:490
nifti_image * controlPointGridImage
The control-point grid image.
Definition: BSplineTransformation.h:185
nifti_image * GetTransformationAsImage()
Definition: BSplineTransformation.cpp:1529
unsigned int numberOfLevelsToPerform
The total number of levels that are used to fit the model. Parameter needed to correctly scale constr...
Definition: Transformation.h:194
double GetConstraintValue()
Definition: BSplineTransformation.cpp:1315
Definition: Transformation.h:52
virtual PrecisionType GetMaxTransformationParameterLength(PrecisionType *parametersIn)
Definition: BSplineTransformation.cpp:1486
void SetBendingEnergyWeight(double bendingEnergyWeightIn)
Definition: BSplineTransformation.cpp:1436
void DVFToCPG2D(nifti_image *controlPointGridImage, nifti_image *denseVectorFieldImage, bool normaliseKernel)
Definition: BSplineTransformation.cpp:715
double bendingEnergyWeight
The bending-energy weight.
Definition: BSplineTransformation.h:186
virtual PrecisionType GetSumOfPenaltyWeights()
Definition: BSplineTransformation.cpp:1460
virtual BSplineTransformation::PrecisionType * GetConstraintGradientWRTTransformationParameters()
Definition: BSplineTransformation.cpp:1282
void CPGToDVF2D(nifti_image *denseVectorFieldImage)
Definition: BSplineTransformation.cpp:348
virtual unsigned int GetNumberOfParameters()
Definition: BSplineTransformation.cpp:188