NifTK  16.4.1 - 0798f20
CMIC's Translational Medical Imaging Platform
itkBoundaryShiftIntegralCalculator.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 itkBoundaryShiftIntegralCalculator_h
16 #define itkBoundaryShiftIntegralCalculator_h
17 
18 #include <itkImage.h>
19 #include <itkObject.h>
20 #include <itkMacro.h>
21 
22 namespace itk
23 {
24 
35 template <class TInputImage, class TInputMask, class TOutputImage>
36 class ITK_EXPORT BoundaryShiftIntegralCalculator: public Object
37 {
38 public:
43  typedef Object Superclass;
44  typedef SmartPointer<Self> Pointer;
45  typedef SmartPointer<const Self> ConstPointer;
49  typedef typename TInputImage::Pointer TInputImagePointer;
50  typedef typename TInputMask::Pointer TInputMaskPointer;
51  typedef itk::Image<int, 3> IntImageType;
55  itkNewMacro(Self);
59  itkTypeMacro(BoundaryShiftIntegralCalculator, Object);
63  itkGetMacro(BoundaryShiftIntegral, double);
64  itkSetMacro(BaselineImage, TInputImagePointer);
65  itkSetMacro(BaselineMask, TInputMaskPointer);
66  itkSetMacro(RepeatImage, TInputImagePointer);
67  itkSetMacro(RepeatMask, TInputMaskPointer);
68  itkSetMacro(NumberOfErosion, unsigned int);
69  itkSetMacro(NumberOfDilation, unsigned int);
70  itkSetMacro(NumberOfSubROIDilation, unsigned int);
71  itkSetMacro(SubROIMask, TInputMaskPointer);
72  itkSetMacro(UpperCutoffValue, double);
73  itkSetMacro(LowerCutoffValue, double);
74  itkSetMacro(BaselineIntensityNormalisationFactor, double);
75  itkSetMacro(RepeatIntensityNormalisationFactor, double);
76  itkSetMacro(PaddingValue, typename TInputMask::PixelType);
77  itkGetMacro(BSIMask, TInputMaskPointer);
78  itkSetMacro(BSIMask, TInputMaskPointer);
79  itkGetMacro(BSIMap,typename TOutputImage::Pointer);
80  itkGetMacro(BSIMapSIENAStyle,TInputImagePointer);
81  itkGetMacro(XORMap, TInputImagePointer);
82  itkSetMacro(ProbabilisticBSI, unsigned int);
83 
87  virtual void Compute(void);
88  void PrintSelf(std::ostream& os, Indent indent) const override;
92  static void PerformLinearRegression(const std::vector<double>& x, const std::vector<double>& y, double* slope, double* intercept)
93  {
94  assert(x.size() == y.size());
95 
96  double correlation = 0.0;
97  double meanX = 0.0;
98  double meanY = 0.0;
99  double varianceX = 0.0;
100  int sizeOfArray = x.size();
101 
102  for (int arrayIndex = 0; arrayIndex < sizeOfArray; arrayIndex++)
103  {
104  meanX += x[arrayIndex];
105  meanY += y[arrayIndex];
106  }
107  meanX /= sizeOfArray;
108  meanY /= sizeOfArray;
109 
110  for (int arrayIndex = 0; arrayIndex < sizeOfArray; arrayIndex++)
111  {
112  correlation += (x[arrayIndex]-meanX)*(y[arrayIndex]-meanY);
113  varianceX += (x[arrayIndex]-meanX)*(x[arrayIndex]-meanX);
114  }
115  *slope = correlation/varianceX;
116  *intercept = meanY-(*slope)*meanX;
117  }
118 
119 protected:
125  virtual void ComputeBSIMask(void);
129  virtual void ComputeGBSIMask(void);
133  virtual void ComputeLedigMask(void);
138  virtual void IntegrateOverBSIMask(void) throw (ExceptionObject);
139 
140 protected:
146  void ComputeErodedIntersectMask(void);
152  void ComputeDilatedUnionMask(void);
156  double m_BoundaryShiftIntegral;
160  TInputImagePointer m_BaselineImage;
164  TInputMaskPointer m_BaselineMask;
168  TInputImagePointer m_RepeatImage;
172  TInputMaskPointer m_RepeatMask;
176  unsigned int m_NumberOfSubROIDilation;
180  TInputMaskPointer m_SubROIMask;
184  unsigned int m_NumberOfErosion;
188  typename IntImageType::Pointer m_ErodedIntersectMask;
192  unsigned int m_NumberOfDilation;
196  typename IntImageType::Pointer m_DilatedUnionMask;
200  typename TInputMask::PixelType m_PaddingValue;
204  TInputMaskPointer m_BSIMask;
209  double m_UpperCutoffValue;
214  double m_LowerCutoffValue;
219  double m_BaselineIntensityNormalisationFactor;
224  double m_RepeatIntensityNormalisationFactor;
228  typename TOutputImage::Pointer m_BSIMap;
232  TInputImagePointer m_BSIMapSIENAStyle;
236  TInputImagePointer m_XORMap;
240  unsigned int m_ProbabilisticBSI;
241 
242  typename IntImageType::Pointer m_BaselineMaskInt;
243  typename IntImageType::Pointer m_RepeatMaskInt;
244  typename IntImageType::Pointer m_PORMaskInt;
245  typename IntImageType::Pointer m_PANDMaskInt;
246 
247  TInputMaskPointer m_POR;
248  TInputMaskPointer m_PAND;
249 
250  void ComputePORandPANDMask(void);
251  void ComputePORandPANDMaskLedig(void);
252 
253 
254 private:
255  BoundaryShiftIntegralCalculator(const Self&); //purposely not implemented
256  void operator=(const Self&); //purposely not implemented
257 
258 };
259 
260 }
261 
262 #ifndef ITK_MANUAL_INSTANTIATION
263 #include "itkBoundaryShiftIntegralCalculator.txx"
264 #endif
265 
266 #endif
267 
268 
BoundaryShiftIntegralCalculator Self
Definition: itkBoundaryShiftIntegralCalculator.h:42
itk::Image< int, 3 > IntImageType
Definition: itkBoundaryShiftIntegralCalculator.h:51
GLint GLint GLint GLint GLint GLint y
Definition: glew.h:1236
Definition: niftkITKAffineResampleImage.cxx:74
Object Superclass
Definition: itkBoundaryShiftIntegralCalculator.h:43
SmartPointer< const Self > ConstPointer
Definition: itkBoundaryShiftIntegralCalculator.h:45
Calculate the boundary shift integral.
Definition: itkBoundaryShiftIntegralCalculator.h:36
TInputMask::Pointer TInputMaskPointer
Definition: itkBoundaryShiftIntegralCalculator.h:50
SmartPointer< Self > Pointer
Definition: itkBoundaryShiftIntegralCalculator.h:44
TInputImage::Pointer TInputImagePointer
Definition: itkBoundaryShiftIntegralCalculator.h:49
float PixelType
Definition: niftkBreastDCEandADC.cxx:88
GLint GLint GLint GLint GLint x
Definition: glew.h:1236
static void PerformLinearRegression(const std::vector< double > &x, const std::vector< double > &y, double *slope, double *intercept)
Definition: itkBoundaryShiftIntegralCalculator.h:92