aimsalgo  5.0.5
Neuroimaging image processing
ffd.h
Go to the documentation of this file.
1 /* Copyright (C) 2000-2013 CEA
2  *
3  * This software and supporting documentation were developed by
4  * bioPICSEL
5  * CEA/DSV/I²BM/MIRCen/LMN, Batiment 61,
6  * 18, route du Panorama
7  * 92265 Fontenay-aux-Roses
8  * France
9  */
10 
11 
12 #ifndef AIMS_REGISTRATION_FFD_H
13 #define AIMS_REGISTRATION_FFD_H
14 
15 #include <aims/data/data.h> // AimsData
16 #include <aims/io/io_g.h> // aims::Reader / Writer
17 #include <aims/math/bspline.h> // aims::TabulBSpline
22 #include <soma-io/transformation/transformation.h> // soma::Transformation
23 #include <aims/utility/channel.h>
24 #include <aims/vector/vector.h> // Point*
25 #include <aims/mesh/surface.h>
26 #include <aims/bucket/bucketMap.h>
27 #include <aims/fibers/bundles.h>
28 #include <limits>
29 #include <string>
30 
31 class Graph;
32 
33 namespace aims {
34 
35 //==========================================================================
36  // FFD TRANSFORMATION
37  //==========================================================================
38 
48  {
49  public:
50  FfdTransformation( int dimX = 0, int dimY = 1, int dimZ = 1,
51  float sizeX = 1., float sizeY = 1., float sizeZ = 1. );
52  template <typename T>
53  FfdTransformation( int dimX, int dimY, int dimZ,
54  const AimsData<T> & test_volume );
55  template <typename T>
56  FfdTransformation( int dimX, int dimY, int dimZ,
57  const carto::Volume<T> & test_volume );
58 
59  FfdTransformation( const FfdTransformation & other );
60  FfdTransformation( const AimsData<Point3df> & other );
62 
63  operator const AimsData<Point3df>&() const { return _ctrlPointDelta; }
64  operator AimsData<Point3df>&() { return _ctrlPointDelta; }
65 
67  bool isIdentity() const CARTO_OVERRIDE { return false; }
68 
69  //--- Control Knots ------------------------------------------------------
70  Point3df getCtrlKnot( int nx, int ny, int nz ) const;
71  void updateCtrlKnot( int nx, int ny, int nz, const Point3df & newCtrlKnot );
72  void updateAllCtrlKnot( const AimsData<Point3df> & newCtrlKnotGrid );
73  void updateAllCtrlKnotFromDeformation( const AimsData<Point3df> & newDeformationGrid );
74 
75  //--- Modify -------------------------------------------------------------
76  void increaseResolution( const Point3d & addKnots );
77  // void inverseTransform();
78  // void estimateLocalDisplacement( const Point3df & voxelSize);
79 
80  //--- Deformation --------------------------------------------------------
81  Point3dd deformation( const Point3dd& p_mm ) const;
82  Point3dd ffdCoord( const Point3dd& p_mm ) const
83  { return mmToSplineVox(p_mm); }
84 
85  //--- Parameters ---------------------------------------------------------
86  int dimX() const { return _dimx; }
87  int dimY() const { return _dimy; }
88  int dimZ() const { return _dimz; }
89  int getSizeX() const { return _dimx; }
90  int getSizeY() const { return _dimy; }
91  int getSizeZ() const { return _dimz; }
92  std::vector<int> getSize() const
93  { std::vector<int> s( 3 ); s[0] = _dimx; s[1] = _dimy; s[2] = _dimz;
94  return s; }
95  float sizeX() const { return _vsx; }
96  float sizeY() const { return _vsy; }
97  float sizeZ() const { return _vsz; }
98  std::vector<float> getVoxelSize() const
99  { std::vector<float> v( 3 ); v[0] = _vsx; v[1] = _vsy; v[2] = _vsz;
100  return v; }
101  bool isFlat( int i ) const
102  {
103  switch(i)
104  {
105  case 0: return _flatx;
106  case 1: return _flaty;
107  case 2: return _flatz;
108  default: return false;
109  }
110  }
111  bool isXFlat() const { return _flatx; }
112  bool isYFlat() const { return _flaty; }
113  bool isZFlat() const { return _flatz; }
114  virtual void updateDimensions();
115 
116  //--- Debug --------------------------------------------------------------
117  void printControlPointsGrid() const;
118  void writeDebugCtrlKnots( const std::string & filename ) const;
119  void writeDebugDeformations( const std::string & filename,
120  int dimX, int dimY, int dimZ,
121  float sizeX, float sizeY, float sizeZ ) const;
122 
123  //--- Output -------------------------------------------------------------
124  void write( const std::string & filename ) const;
125 
126  protected:
127  //--- Protected methods --------------------------------------------------
128  Point3dd splineVoxToMm( const Point3dd& p ) const;
129  Point3dd mmToSplineVox( const Point3dd& p ) const;
130  void updateGridResolution( const AimsData<Point3df> & newGrid );
131 
132  virtual Point3dd _deformation( const Point3dd& p_mm ) const = 0;
133 
136  float _vsx, _vsy, _vsz;
138  };
139 
140  template <typename T>
141  inline
143  const AimsData<T> & test_volume ):
144  _ctrlPointDelta( dimX, dimY, dimZ ),
145  _dimx( dimX ), _dimy( dimY ), _dimz( dimZ ),
146  _flatx( dimX == 1 ), _flaty( dimY == 1 ), _flatz( dimZ == 1 )
147  {
148  _ctrlPointDelta = Point3df(0., 0., 0.);
149  _ctrlPointDelta.setSizeXYZT(
150  _flatx ? test_volume.sizeX() : double(test_volume.dimX() - 1) / double(dimX - 1) * test_volume.sizeX(),
151  _flaty ? test_volume.sizeY() : double(test_volume.dimY() - 1) / double(dimY - 1) * test_volume.sizeY(),
152  _flatz ? test_volume.sizeZ() : double(test_volume.dimZ() - 1) / double(dimZ - 1) * test_volume.sizeZ()
153  );
155  }
156 
157  template <typename T>
158  inline
160  const carto::Volume<T> & test_volume ):
161  _ctrlPointDelta( dimX, dimY, dimZ ),
162  _dimx( dimX ), _dimy( dimY ), _dimz( dimZ ),
163  _flatx( dimX == 1 ), _flaty( dimY == 1 ), _flatz( dimZ == 1 )
164  {
165  _ctrlPointDelta = Point3df(0., 0., 0.);
166  std::vector<float> vs = test_volume.getVoxelSize();
167  _ctrlPointDelta.setSizeXYZT(
168  _flatx ? vs[0] : double(test_volume.getSizeX() - 1) / double(dimX - 1) * vs[0],
169  _flaty ? vs[1] : double(test_volume.getSizeY() - 1) / double(dimY - 1) * vs[1],
170  _flatz ? vs[2] : double(test_volume.getSizeZ() - 1) / double(dimZ - 1) * vs[2]
171  );
173  }
174 
175  inline Point3dd
177  {
178  return Point3dd( p[0] * sizeX(),
179  p[1] * sizeY(),
180  p[2] * sizeZ() );
181  }
182 
183  inline Point3dd
185  {
186  return Point3dd( p[0] / sizeX(),
187  p[1] / sizeY(),
188  p[2] / sizeZ() );
189  }
190 
191  //==========================================================================
192  // FFD TRANSFORMATION
193  //==========================================================================
194 
223  {
224  public:
225  //--- Constructor --------------------------------------------------------
226  SplineFfd( int dimX = 0, int dimY = 1, int dimZ = 1,
227  float sizeX = 1., float sizeY = 1., float sizeZ = 1. );
228  template <typename T>
229  SplineFfd( int dimX, int dimY, int dimZ,
230  const AimsData<T> & test_volume );
231  template <typename T>
232  SplineFfd( int dimX, int dimY, int dimZ,
233  const carto::Volume<T> & test_volume );
234 
235  SplineFfd( const SplineFfd & other );
236  SplineFfd( const AimsData<Point3df> & other );
237  SplineFfd & operator=( const SplineFfd & other );
238 
239  virtual void updateDimensions();
240  //--- Deformation --------------------------------------------------------
241  Point3dd deformation( const Point3dd& p_mm ) const;
242  double spline3( double x ) const { return _spline(x); }
243 
244  private:
245  virtual Point3dd transformDouble( double x, double y, double z ) const;
246  virtual Point3dd _deformation( const Point3dd& p_mm ) const
247  { return deformation_private(p_mm); };
248  Point3dd deformation_private( const Point3dd& p_mm ) const;
249 
250  const aims::TabulBSpline _spline;
251  std::vector<int> _mirrorcoefvecx;
252  std::vector<int> _mirrorcoefvecy;
253  std::vector<int> _mirrorcoefvecz;
254  int *_mirrorcoefx;
255  int *_mirrorcoefy;
256  int *_mirrorcoefz;
257  };
258 
259  template <typename T>
260  inline
262  const AimsData<T> & test_volume ):
263  FfdTransformation( dimX, dimY, dimZ, test_volume ),
264  _spline(3, 0)
265  {
266  }
267 
268  template <typename T>
269  inline
271  const carto::Volume<T> & test_volume ):
272  FfdTransformation( dimX, dimY, dimZ, test_volume ),
273  _spline(3, 0)
274  {
275  }
276 
277 
278  //==========================================================================
279  // FFD TRILINEAR RESAMPLED TRANSFORMATION
280  //==========================================================================
281 
292  {
293  public:
294  //--- Constructor --------------------------------------------------------
295  TrilinearFfd( int dimX = 0, int dimY = 1, int dimZ = 1,
296  float sizeX = 1., float sizeY = 1., float sizeZ = 1. );
297  template <typename T>
298  TrilinearFfd( int dimX, int dimY, int dimZ,
299  const AimsData<T> & test_volume );
300 
301  TrilinearFfd( const TrilinearFfd & other );
302  TrilinearFfd( const AimsData<Point3df> & other );
303  TrilinearFfd & operator=( const TrilinearFfd & other );
304 
305  //--- Deformation --------------------------------------------------------
306  Point3dd deformation( const Point3dd& p_mm ) const;
307  private:
308  virtual Point3dd transformDouble( double x, double y, double z ) const;
309  virtual Point3dd _deformation( const Point3dd& p_mm ) const
310  { return deformation_private(p_mm); };
311  Point3dd deformation_private( const Point3dd& p_mm ) const;
312  };
313 
314  template <typename T>
315  inline
317  const AimsData<T> & test_volume ):
318  FfdTransformation( dimX, dimY, dimZ, test_volume )
319  {
320  }
321 
322 //============================================================================
323 // FFD READER/WRITER
324 //============================================================================
325 
329  template<>
330  class Writer<aims::FfdTransformation> : public Writer<AimsData<Point3df> >
331  {
333  public:
334  inline Writer(): base() {}
335  inline Writer( const std::string& filename,
336  carto::Object options = carto::none() ):
337  base( filename, options ) {}
338  virtual ~Writer() {}
339  virtual bool write( const aims::FfdTransformation & obj,
340  bool ascii = false,
341  const std::string* format = 0 );
342  };
343 
344 } // namespace aims
345 
346 #endif
FFD vector field deformation transform.
Definition: ffd.h:222
FfdTransformation(int dimX=0, int dimY=1, int dimZ=1, float sizeX=1., float sizeY=1., float sizeZ=1.)
SplineFfd & operator=(const SplineFfd &other)
int dimZ() const
int getSizeZ() const
int getSizeZ() const
Definition: ffd.h:91
float sizeX() const
Definition: ffd.h:95
void updateCtrlKnot(int nx, int ny, int nz, const Point3df &newCtrlKnot)
Writer(const std::string &filename, carto::Object options=carto::none())
Definition: ffd.h:335
Point3dd ffdCoord(const Point3dd &p_mm) const
Definition: ffd.h:82
void writeDebugCtrlKnots(const std::string &filename) const
virtual Point3dd _deformation(const Point3dd &p_mm) const =0
void updateAllCtrlKnot(const AimsData< Point3df > &newCtrlKnotGrid)
bool isIdentity() const CARTO_OVERRIDE
Always false, because testing for identity is expensive.
Definition: ffd.h:67
float sizeZ() const
FFD vector field deformation transform.
Definition: ffd.h:291
int dimY() const
FFD vector field deformation transform.
Definition: ffd.h:47
bool isYFlat() const
Definition: ffd.h:112
AimsData< Point3df > _ctrlPointDelta
Definition: ffd.h:134
bool isZFlat() const
Definition: ffd.h:113
Point3dd splineVoxToMm(const Point3dd &p) const
Definition: ffd.h:176
int getSizeX() const
void write(const std::string &filename) const
bool isFlat(int i) const
Definition: ffd.h:101
Point3dd deformation(const Point3dd &p_mm) const
float sizeX() const
Pre-computed B-Spline values In the "order 0" case, the array is not used (the analytical expression ...
Definition: bspline.h:251
float sizeY() const
Definition: ffd.h:96
std::vector< int > getSize() const
Definition: ffd.h:92
bool isXFlat() const
Definition: ffd.h:111
int dimX() const
Definition: ffd.h:86
Point3df getCtrlKnot(int nx, int ny, int nz) const
int dimZ() const
Definition: ffd.h:88
Point3dd mmToSplineVox(const Point3dd &p) const
Definition: ffd.h:184
void updateGridResolution(const AimsData< Point3df > &newGrid)
virtual Point3dd transformDouble(double x, double y, double z) const=0
int getSizeY() const
Definition: ffd.h:90
void updateAllCtrlKnotFromDeformation(const AimsData< Point3df > &newDeformationGrid)
double spline3(double x) const
Definition: ffd.h:242
void writeDebugDeformations(const std::string &filename, int dimX, int dimY, int dimZ, float sizeX, float sizeY, float sizeZ) const
int dimY() const
Definition: ffd.h:87
float sizeY() const
SplineFfd(int dimX=0, int dimY=1, int dimZ=1, float sizeX=1., float sizeY=1., float sizeZ=1.)
void printControlPointsGrid() const
int getSizeX() const
Definition: ffd.h:89
std::vector< float > getVoxelSize() const
void increaseResolution(const Point3d &addKnots)
std::vector< float > getVoxelSize() const
Definition: ffd.h:98
int getSizeY() const
TrilinearFfd(int dimX=0, int dimY=1, int dimZ=1, float sizeX=1., float sizeY=1., float sizeZ=1.)
Point3dd deformation(const Point3dd &p_mm) const
Object none()
float sizeZ() const
Definition: ffd.h:97
FfdTransformation & operator=(const FfdTransformation &other)
int dimX() const
virtual void updateDimensions()