Slicer  4.8
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
itkImageRegionMomentsCalculator.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Insight Segmentation & Registration Toolkit
4  Module: $RCSfile: itkImageRegionMomentsCalculator.h,v $
5  Language: C++
6  Date: $Date: 2008-10-06 08:54:43 $
7  Version: $Revision: 1.39 $
8 
9  Copyright (c) Insight Software Consortium. All rights reserved.
10  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
11 
12  This software is distributed WITHOUT ANY WARRANTY; without even
13  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14  PURPOSE. See the above copyright notices for more information.
15 
16 =========================================================================*/
17 #ifndef itkImageRegionMomentsCalculator_h
18 #define itkImageRegionMomentsCalculator_h
19 
20 #include "itkAffineTransform.h"
21 #include "itkMacro.h"
22 #include "itkImage.h"
23 #include "itkSpatialObject.h"
24 
25 #include "vnl/vnl_vector_fixed.h"
26 #include "vnl/vnl_matrix_fixed.h"
27 #include "vnl/vnl_diag_matrix.h"
28 
29 namespace itk
30 {
31 
59 template <class TImage>
60 class ImageRegionMomentsCalculator : public Object
61 {
62 public:
65  typedef Object Superclass;
66  typedef SmartPointer<Self> Pointer;
67  typedef SmartPointer<const Self> ConstPointer;
68 
70  itkNewMacro(Self);
71 
74 
76  itkStaticConstMacro(ImageDimension, unsigned int,
77  TImage::ImageDimension);
78 
80  typedef double ScalarType;
81 
82  typedef typename TImage::PointType PointType;
83 
85  typedef Vector<ScalarType, itkGetStaticConstMacro(ImageDimension)> VectorType;
86 
88  typedef SpatialObject<itkGetStaticConstMacro(ImageDimension)> SpatialObjectType;
89 
91  typedef typename SpatialObjectType::Pointer SpatialObjectPointer;
92  typedef typename SpatialObjectType::ConstPointer SpatialObjectConstPointer;
93 
95  typedef Matrix<ScalarType,
96  itkGetStaticConstMacro(ImageDimension),
97  itkGetStaticConstMacro(ImageDimension)> MatrixType;
98 
100  typedef TImage ImageType;
101 
103  typedef typename ImageType::Pointer ImagePointer;
104  typedef typename ImageType::ConstPointer ImageConstPointer;
105 
107  typedef AffineTransform<double, itkGetStaticConstMacro(ImageDimension)> AffineTransformType;
108  typedef typename AffineTransformType::Pointer AffineTransformPointer;
109 
111  virtual void SetImage( const ImageType * image )
112  {
113  if( m_Image != image )
114  {
115  m_Image = image;
116  this->Modified();
117  m_Valid = false;
118  }
119  }
120 
122  virtual void SetSpatialObjectMask( const SpatialObject<itkGetStaticConstMacro( ImageDimension )> * so )
123  {
124  if( m_SpatialObjectMask != so )
125  {
126  m_SpatialObjectMask = so;
127  this->Modified();
128  m_Valid = false;
129  }
130  }
131 
134  itkSetMacro(UseRegionOfInterest, bool);
135  itkGetMacro(UseRegionOfInterest, bool);
136  virtual void SetRegionOfInterest( const PointType & point1, const PointType & point2 )
137  {
138  if( m_RegionOfInterestPoint1 != point1 || m_RegionOfInterestPoint2 != point2 )
139  {
140  m_RegionOfInterestPoint1 = point1;
141  m_RegionOfInterestPoint2 = point2;
142  this->Modified();
143  m_Valid = false;
144  }
145  }
146 
147  itkGetMacro(RegionOfInterestPoint1, PointType);
148  itkGetMacro(RegionOfInterestPoint2, PointType);
149 
155  void Compute( void );
156 
161  ScalarType GetTotalMass() const;
162 
168  VectorType GetFirstMoments() const;
169 
176 
181  VectorType GetCenterOfGravity() const;
182 
188 
195  VectorType GetPrincipalMoments() const;
196 
210 
214  AffineTransformPointer GetPrincipalAxesToPhysicalAxesTransform(void) const;
215 
220  AffineTransformPointer GetPhysicalAxesToPrincipalAxesTransform(void) const;
221 
222 protected:
225  void PrintSelf(std::ostream& os, Indent indent) const ITK_OVERRIDE;
226 
227 private:
228  ImageRegionMomentsCalculator(const Self &); // purposely not implemented
229  void operator=(const Self &); // purposely not implemented
230 
231  bool m_Valid; // Have moments been computed yet?
232  ScalarType m_M0; // Zeroth moment
233  VectorType m_M1; // First moments about origin
234  MatrixType m_M2; // Second moments about origin
235  VectorType m_Cg; // Center of gravity (physical units)
236  MatrixType m_Cm; // Second central moments (physical)
237  VectorType m_Pm; // Principal moments (physical)
238  MatrixType m_Pa; // Principal axes (physical)
239 
240  bool m_UseRegionOfInterest;
241  PointType m_RegionOfInterestPoint1;
242  PointType m_RegionOfInterestPoint2;
243 
244  ImageConstPointer m_Image;
245  SpatialObjectConstPointer m_SpatialObjectMask;
246 
247 }; // class ImageRegionMomentsCalculator
248 
249 } // end namespace itk
250 
251 #ifndef ITK_MANUAL_INSTANTIATION
252 #include "itkImageRegionMomentsCalculator.txx"
253 #endif
254 
255 #endif /* itkImageRegionMomentsCalculator_h */
VectorType GetCenterOfGravity() const
AffineTransformPointer GetPrincipalAxesToPhysicalAxesTransform(void) const
virtual void SetImage(const ImageType *image)
Compute moments of an n-dimensional image.
AffineTransformType::Pointer AffineTransformPointer
VectorType GetPrincipalMoments() const
AffineTransform< double, itkGetStaticConstMacro(ImageDimension)> AffineTransformType
MatrixType GetPrincipalAxes() const
Simplified inverse ITK transforms.
Vector< ScalarType, itkGetStaticConstMacro(ImageDimension)> VectorType
Matrix< ScalarType, itkGetStaticConstMacro(ImageDimension), itkGetStaticConstMacro(ImageDimension)> MatrixType
AffineTransformPointer GetPhysicalAxesToPrincipalAxesTransform(void) const
MatrixType GetSecondMoments() const
ImageRegionMomentsCalculator< TImage > Self
virtual void SetRegionOfInterest(const PointType &point1, const PointType &point2)
itkTypeMacro(ImageRegionMomentsCalculator, Object)
SpatialObjectType::ConstPointer SpatialObjectConstPointer
SpatialObject< itkGetStaticConstMacro(ImageDimension)> SpatialObjectType
itkSetMacro(UseRegionOfInterest, bool)
itkStaticConstMacro(ImageDimension, unsigned int, TImage::ImageDimension)
virtual void SetSpatialObjectMask(const SpatialObject< itkGetStaticConstMacro(ImageDimension)> *so)
VectorType GetFirstMoments() const
void PrintSelf(std::ostream &os, Indent indent) const ITK_OVERRIDE
MatrixType GetCentralMoments() const
itkGetMacro(UseRegionOfInterest, bool)