NifTK  16.4.1 - 0798f20
CMIC's Translational Medical Imaging Platform
itkRegistrationBasedCTEFilter.h
Go to the documentation of this file.
1 /*=============================================================================
2 
3  NifTK: A software platform for medical image computing.
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 #ifndef itkRegistrationBasedCTEFilter_h
16 #define itkRegistrationBasedCTEFilter_h
17 
18 #include <itkImageToImageFilter.h>
19 #include <itkVector.h>
20 #include <itkImage.h>
21 #include <itkImageFileWriter.h>
22 #include <itkLinearInterpolateImageFunction.h>
24 #include <itkDisplacementFieldJacobianDeterminantFilter.h>
25 #include <itkMinimumMaximumImageCalculator.h>
27 #include <itkSubtractImageFilter.h>
28 #include <itkVectorMagnitudeImageFilter.h>
31 #include "itkDasGradientFilter.h"
32 #include <itkDiscreteGaussianImageFilter.h>
33 
34 namespace itk {
35 
36 /*
37  * \class RegistrationBasedCTEFilter
38  * \brief This class implements Das et al Neuroimage 45 (2009) 867-879.
39  *
40  * The inputs to this filter should be exactly as follows.
41  * <pre>
42  * input1 = white matter pv image, set using SetWhiteMatterPVMap(image)
43  * input2 = white + grey pv image, set using SetWhitePlusGreyMatterPVMap(image)
44  * input3 = thickness prior image, set using SetThicknessPriorMap(image)
45  * input4 = the grey white border, as a binary image where 1 = boundary and 0 is background, set using SetGWI(image)
46  * </pre>
47  *
48  * The output is the DiReCT thickness map.
49  *
50  * After registration, we can additionally output the displacement field,
51  * using the method WriteDisplacementField(filename).
52  */
53 template< class TInputImage, typename TScalarType>
54 class ITK_EXPORT RegistrationBasedCTEFilter :
55  public ImageToImageFilter<TInputImage, TInputImage>
56 {
57 public:
58 
60  typedef TScalarType VectorDataType;
62  typedef ImageToImageFilter<TInputImage, TInputImage> Superclass;
63  typedef SmartPointer<Self> Pointer;
64  typedef SmartPointer<const Self> ConstPointer;
65 
67  itkNewMacro(Self);
68 
70  itkTypeMacro(RegistrationBasedCTEFilter, ImageToImageFilter);
71 
73  itkStaticConstMacro(Dimension, unsigned int, TInputImage::ImageDimension);
74 
76  typedef TInputImage ImageType;
77  typedef typename ImageType::PixelType PixelType;
78  typedef typename ImageType::Pointer ImagePointer;
79  typedef typename ImageType::SizeType SizeType;
80  typedef typename ImageType::IndexType IndexType;
82  typedef typename ImageType::SpacingType SpacingType;
83  typedef typename ImageType::PointType OriginType;
84  typedef typename ImageType::DirectionType DirectionType;
85  typedef Vector< VectorDataType, itkGetStaticConstMacro(Dimension) > VectorPixelType;
87  typedef typename VectorImageType::Pointer VectorImagePointer;
91  typedef typename VectorImageType::SpacingType VectorImageSpacingType;
92  typedef typename VectorImageType::PointType VectorImagePointType;
93  typedef typename VectorImageType::PointType VectorImageOriginType;
94  typedef typename VectorImageType::DirectionType VectorImageDirectionType;
95  typedef ImageFileReader< VectorImageType > VectorImageReaderType;
96  typedef ImageFileWriter< VectorImageType > VectorImageWriterType;
97  typedef ImageFileWriter< ImageType > ScalarImageWriterType;
98 
99  typedef LinearInterpolateImageFunction< TInputImage, TScalarType > LinearInterpolatorType;
100  typedef GaussianSmoothVectorFieldFilter<TScalarType,
101  itkGetStaticConstMacro(Dimension),
102  itkGetStaticConstMacro(Dimension)
104  typedef DisplacementFieldJacobianDeterminantFilter<VectorImageType,
105  TScalarType,
106  TInputImage> JacobianFilterType;
107  typedef MinimumMaximumImageCalculator<TInputImage> MinMaxJacobianType;
108  typedef SetOutputVectorToCurrentPositionFilter<TScalarType,
109  itkGetStaticConstMacro(Dimension)> InitializePhiFilterType;
110  typedef SubtractImageFilter<VectorImageType, VectorImageType> SubtractImageFilterType;
111  typedef VectorMagnitudeImageFilter<VectorImageType, TInputImage> VectorMagnitudeFilterType;
112  typedef VectorVPlusLambdaUImageFilter<TScalarType,
113  itkGetStaticConstMacro(Dimension)> VectorVPlusLambdaUFilterType;
114 
115  typedef VectorPhiPlusDeltaTTimesVFilter<TScalarType,
117  typedef DasGradientFilter<TScalarType,
118  itkGetStaticConstMacro(Dimension)> DasGradientFilterType;
119  typedef DasTransformImageFilter<TScalarType,
120  itkGetStaticConstMacro(Dimension)> DasTransformImageFilterType;
121  typedef DiscreteGaussianImageFilter<ImageType,ImageType> GaussianSmoothImageFilterType;
122 
124  void SetWhiteMatterPVMap(ImagePointer image) { this->SetInput(0, image); }
125 
127  void SetWhitePlusGreyMatterPVMap(ImagePointer image) { this->SetInput(1, image); }
128 
130  void SetThicknessPriorMap(ImagePointer image) { this->SetInput(2, image); }
131 
133  void SetGWI(ImagePointer image) { this->SetInput(3, image); }
134 
136  itkSetMacro(MaxIterations, unsigned int);
137  itkGetMacro(MaxIterations, unsigned int);
138 
140  itkSetMacro(M, unsigned int);
141  itkGetMacro(M, unsigned int);
142 
144  itkSetMacro(N, unsigned int);
145  itkGetMacro(N, unsigned int);
146 
148  itkSetMacro(Lambda, double);
149  itkGetMacro(Lambda, double);
150 
152  itkSetMacro(Sigma, double);
153  itkGetMacro(Sigma, double);
154 
156  itkSetMacro(Epsilon, double);
157  itkGetMacro(Epsilon, double);
158 
168  itkSetMacro(Alpha, double);
169  itkGetMacro(Alpha, double);
170 
172  void WriteDisplacementField(std::string filename);
173 
180  itkSetMacro(OutputAbsoluteLocation, bool);
181  itkGetMacro(OutputAbsoluteLocation, bool);
182 
187  itkSetMacro(TrackJacobian, bool);
188  itkGetMacro(TrackJacobian, bool);
189 
195  itkSetMacro(WriteMagnitudeOfDisplacementImage, bool);
196  itkGetMacro(WriteMagnitudeOfDisplacementImage, bool);
197 
202  itkSetMacro(WriteTSurfImage, bool);
203  itkGetMacro(WriteTSurfImage, bool);
204 
210  itkSetMacro(WriteGradientImage, bool);
211  itkGetMacro(WriteGradientImage, bool);
212 
218  itkSetMacro(WriteVelocityImage, bool);
219  itkGetMacro(WriteVelocityImage, bool);
220 
224  itkSetMacro(WriteTransformedMovingImage, bool);
225  itkGetMacro(WriteTransformedMovingImage, bool);
226 
230  itkSetMacro(SmoothPVMaps, bool);
231  itkGetMacro(SmoothPVMaps, bool);
232 
236  itkSetMacro(SmoothPVMapSigma, double);
237  itkGetMacro(SmoothPVMapSigma, double);
238 
243  itkSetMacro(UseGradientMovingImage, bool);
244  itkGetMacro(UseGradientMovingImage, bool);
245 
246 protected:
247 
250  void PrintSelf(std::ostream& os, Indent indent) const;
251 
252  /* The main filter method. Note, single threaded. */
253  virtual void GenerateData();
254 
255 private:
256 
260  RegistrationBasedCTEFilter(const Self&);
261  void operator=(const Self&);
262 
263  unsigned int m_MaxIterations;
264  unsigned int m_M;
265  unsigned int m_N;
266  double m_Epsilon;
267  double m_Sigma;
268  double m_Lambda;
269  double m_Alpha;
270  double m_SmoothPVMapSigma;
271  bool m_OutputAbsoluteLocation;
272  bool m_TrackJacobian;
273  bool m_WriteMagnitudeOfDisplacementImage;
274  bool m_WriteTSurfImage;
275  bool m_WriteGradientImage;
276  bool m_WriteVelocityImage;
277  bool m_WriteTransformedMovingImage;
278  bool m_SmoothPVMaps;
279  bool m_UseGradientMovingImage;
280 
281  VectorImagePointer m_PhiZeroImageUninitialized;
282  VectorImagePointer m_PhiZeroImage;
283  VectorImagePointer m_FinalPhiImage;
284 
286  typename InitializePhiFilterType::Pointer m_InitializePhiZeroFilter;
287  typename GaussianSmoothImageFilterType::Pointer m_SmoothWMPVMapFilter;
288  typename GaussianSmoothImageFilterType::Pointer m_SmoothGMWMPVMapFilter;
289 
291  void InitializeScalarImage(ImageType *image,
292  RegionType& region,
293  SpacingType& spacing,
294  OriginType& origin,
295  DirectionType& direction);
296 
298  void InitializeVectorImage(VectorImageType* image,
299  const VectorImageRegionType& region,
300  const VectorImageSpacingType& spacing,
301  const VectorImageOriginType& origin,
302  const VectorImageDirectionType& direction);
303 
305  double EvaluateVelocityField(VectorImageType* velocityField, double dt);
306 
308  double EvaluateRegistrationSimilarity(VectorImageType* phi, ImageType* target, ImageType* source);
309 
311  double EvaluateCostFunction(double velocityFieldEnergy, double imageSimilarity);
312 
314  void CalculateMinAndMaxJacobian(VectorImageType* phi, double &min, double& max);
315 
317  double CalculateMaxDisplacement(VectorImageType* phi);
318 
320  double CalculateMaxMagnitude(VectorImageType* vec);
321 
323  void CopyVectorField(VectorImageType* a, VectorImageType* b);
324 
326  void RemoveFile(std::string filename);
327 
329  std::string GetFileName(int i, std::string, std::string);
330 
331 }; // end class
332 
333 } // end namespace
334 
335 #ifndef ITK_MANUAL_INSTANTIATION
336 #include "itkRegistrationBasedCTEFilter.txx"
337 #endif
338 
339 #endif
VectorImageType::PointType VectorImagePointType
Definition: itkRegistrationBasedCTEFilter.h:92
void SetWhitePlusGreyMatterPVMap(ImagePointer image)
Definition: itkRegistrationBasedCTEFilter.h:127
ImageType::DirectionType DirectionType
Definition: itkRegistrationBasedCTEFilter.h:84
ImageType::Pointer ImagePointer
Definition: itkRegistrationBasedCTEFilter.h:78
RegistrationBasedCTEFilter Self
Definition: itkRegistrationBasedCTEFilter.h:61
This class basically takes two vector images as input (Phi and V) and calculates Phi + (dt * V)...
Definition: itkVectorPhiPlusDeltaTTimesVFilter.h:55
void SetGWI(ImagePointer image)
Definition: itkRegistrationBasedCTEFilter.h:133
ImageType::SizeType SizeType
Definition: niftkMakeLapUSProbeBasicModel.cxx:31
VectorMagnitudeImageFilter< VectorImageType, TInputImage > VectorMagnitudeFilterType
Definition: itkRegistrationBasedCTEFilter.h:111
VectorImageType::SizeType VectorImageSizeType
Definition: itkRegistrationBasedCTEFilter.h:88
TInputImage ImageType
Definition: itkRegistrationBasedCTEFilter.h:76
GLenum GLsizei GLenum GLenum const GLvoid * image
Definition: glew.h:4052
VectorImageType::IndexType VectorImageIndexType
Definition: itkRegistrationBasedCTEFilter.h:89
VectorVPlusLambdaUImageFilter< TScalarType, itkGetStaticConstMacro(Dimension)> VectorVPlusLambdaUFilterType
Definition: itkRegistrationBasedCTEFilter.h:113
ImageType::IndexType IndexType
Definition: itkRegistrationBasedCTEFilter.h:80
DasGradientFilter< TScalarType, itkGetStaticConstMacro(Dimension)> DasGradientFilterType
Definition: itkRegistrationBasedCTEFilter.h:118
Definition: niftkITKAffineResampleImage.cxx:74
ImageType::IndexType IndexType
Definition: niftkMakeLapUSProbeBasicModel.cxx:32
ImageType::PointType OriginType
Definition: itkRegistrationBasedCTEFilter.h:83
GLdouble GLdouble GLdouble b
Definition: glew.h:7885
Vector< VectorDataType, itkGetStaticConstMacro(Dimension) > VectorPixelType
Definition: itkRegistrationBasedCTEFilter.h:85
MinimumMaximumImageCalculator< TInputImage > MinMaxJacobianType
Definition: itkRegistrationBasedCTEFilter.h:107
VectorImageType::DirectionType VectorImageDirectionType
Definition: itkRegistrationBasedCTEFilter.h:94
VectorPhiPlusDeltaTTimesVFilter< TScalarType, itkGetStaticConstMacro(Dimension)> VectorPhiPlusDeltaTTimesVFilterType
Definition: itkRegistrationBasedCTEFilter.h:116
ImageToImageFilter< TInputImage, TInputImage > Superclass
Definition: itkRegistrationBasedCTEFilter.h:62
VectorImageType::PointType VectorImageOriginType
Definition: itkRegistrationBasedCTEFilter.h:93
GLboolean GLboolean GLboolean GLboolean a
Definition: glew.h:8272
SetOutputVectorToCurrentPositionFilter< TScalarType, itkGetStaticConstMacro(Dimension)> InitializePhiFilterType
Definition: itkRegistrationBasedCTEFilter.h:109
Image< VectorPixelType, itkGetStaticConstMacro(Dimension) > VectorImageType
Definition: itkRegistrationBasedCTEFilter.h:86
float PixelType
Definition: niftkBreastDCEandADC.cxx:88
This class calculates the gradient as per equation 3 in Das et. al. Neuroimage 45 (2009) 867-879...
Definition: itkDasGradientFilter.h:45
ImageType::PixelType PixelType
Definition: itkRegistrationBasedCTEFilter.h:77
TScalarType VectorDataType
Definition: itkRegistrationBasedCTEFilter.h:60
ImageType::RegionType RegionType
Definition: niftkMakeLapUSProbeBasicModel.cxx:30
Transform an image using a vector field, where each vector represents the absolute sampling position...
Definition: itkDasTransformImageFilter.h:33
LinearInterpolateImageFunction< TInputImage, TScalarType > LinearInterpolatorType
Definition: itkRegistrationBasedCTEFilter.h:99
SubtractImageFilter< VectorImageType, VectorImageType > SubtractImageFilterType
Definition: itkRegistrationBasedCTEFilter.h:110
ImageType::SizeType SizeType
Definition: itkRegistrationBasedCTEFilter.h:79
ImageFileWriter< ImageType > ScalarImageWriterType
Definition: itkRegistrationBasedCTEFilter.h:97
VectorImageType::RegionType VectorImageRegionType
Definition: itkRegistrationBasedCTEFilter.h:90
DiscreteGaussianImageFilter< ImageType, ImageType > GaussianSmoothImageFilterType
Definition: itkRegistrationBasedCTEFilter.h:121
DisplacementFieldJacobianDeterminantFilter< VectorImageType, TScalarType, TInputImage > JacobianFilterType
Definition: itkRegistrationBasedCTEFilter.h:106
void SetWhiteMatterPVMap(ImagePointer image)
Definition: itkRegistrationBasedCTEFilter.h:124
Simultaneous itk::Image and itk::Array (and hence vnl_vector) class.
VectorImageType::SpacingType VectorImageSpacingType
Definition: itkRegistrationBasedCTEFilter.h:91
const unsigned int Dimension
Definition: niftkBreastDCEandADC.cxx:89
void SetThicknessPriorMap(ImagePointer image)
Definition: itkRegistrationBasedCTEFilter.h:130
DasTransformImageFilter< TScalarType, itkGetStaticConstMacro(Dimension)> DasTransformImageFilterType
Definition: itkRegistrationBasedCTEFilter.h:120
SmartPointer< Self > Pointer
Definition: itkRegistrationBasedCTEFilter.h:63
This class takes a vector image as input, and outputs a vector image, where the vector data value at ...
Definition: itkSetOutputVectorToCurrentPositionFilter.h:34
This class takes two vector images as input (V and U), and calculates V + (lambda * U)...
Definition: itkVectorVPlusLambdaUImageFilter.h:35
ImageType::SpacingType SpacingType
Definition: itkRegistrationBasedCTEFilter.h:82
ImageFileReader< VectorImageType > VectorImageReaderType
Definition: itkRegistrationBasedCTEFilter.h:95
Definition: itkRegistrationBasedCTEFilter.h:54
~RegistrationBasedCTEFilter()
Definition: itkRegistrationBasedCTEFilter.h:249
SmartPointer< const Self > ConstPointer
Definition: itkRegistrationBasedCTEFilter.h:64
Class that takes a vector field, and applies Gaussian smoothing.
Definition: itkGaussianSmoothVectorFieldFilter.h:35
ImageFileWriter< VectorImageType > VectorImageWriterType
Definition: itkRegistrationBasedCTEFilter.h:96
GLsizei const GLcharARB ** string
Definition: glew.h:5194
GLsizei GLsizei GLchar * source
Definition: glew.h:1816
GLenum target
Definition: glew.h:5584
VectorImageType::Pointer VectorImagePointer
Definition: itkRegistrationBasedCTEFilter.h:87
GaussianSmoothVectorFieldFilter< TScalarType, itkGetStaticConstMacro(Dimension), itkGetStaticConstMacro(Dimension) > ConvolveFilterType
Definition: itkRegistrationBasedCTEFilter.h:103
ImageType::RegionType RegionType
Definition: itkRegistrationBasedCTEFilter.h:81