ITK  5.4.0
Insight Toolkit
itkStatisticsLabelObject.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * https://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkStatisticsLabelObject_h
19 #define itkStatisticsLabelObject_h
20 
21 #include "itkShapeLabelObject.h"
22 #include "itkHistogram.h"
23 
24 namespace itk
25 {
40 template <typename TLabel, unsigned int VImageDimension>
41 class ITK_TEMPLATE_EXPORT StatisticsLabelObject : public ShapeLabelObject<TLabel, VImageDimension>
42 {
43 public:
44  ITK_DISALLOW_COPY_AND_MOVE(StatisticsLabelObject);
45 
49  using LabelObjectType = typename Superclass::LabelObjectType;
53 
55  itkNewMacro(Self);
56 
58  itkOverrideGetNameOfClassMacro(StatisticsLabelObject);
59 
61 
62  static constexpr unsigned int ImageDimension = VImageDimension;
63 
64  using typename Superclass::IndexType;
65 
67 
68  using LabelType = TLabel;
69 
70  using typename Superclass::LineType;
71 
72  using typename Superclass::LengthType;
73 
75 
77 
79 
80  using typename Superclass::AttributeType;
81  static constexpr AttributeType MINIMUM = 200;
82  static constexpr AttributeType MAXIMUM = 201;
83  static constexpr AttributeType MEAN = 202;
84  static constexpr AttributeType SUM = 203;
85  static constexpr AttributeType STANDARD_DEVIATION = 204;
86  static constexpr AttributeType VARIANCE = 205;
87  static constexpr AttributeType MEDIAN = 206;
88  static constexpr AttributeType MAXIMUM_INDEX = 207;
89  static constexpr AttributeType MINIMUM_INDEX = 208;
90  static constexpr AttributeType CENTER_OF_GRAVITY = 209;
91  // static constexpr AttributeType CENTRAL_MOMENTS = 210;
92  static constexpr AttributeType WEIGHTED_PRINCIPAL_MOMENTS = 211;
93  static constexpr AttributeType WEIGHTED_PRINCIPAL_AXES = 212;
94  static constexpr AttributeType KURTOSIS = 213;
95  static constexpr AttributeType SKEWNESS = 214;
96  static constexpr AttributeType WEIGHTED_ELONGATION = 215;
97  static constexpr AttributeType HISTOGRAM = 216;
98  static constexpr AttributeType WEIGHTED_FLATNESS = 217;
99 
100  static AttributeType
101  GetAttributeFromName(const std::string & s)
102  {
103  if (s == "Minimum")
104  {
105  return MINIMUM;
106  }
107  else if (s == "Maximum")
108  {
109  return MAXIMUM;
110  }
111  else if (s == "Mean")
112  {
113  return MEAN;
114  }
115  else if (s == "Sum")
116  {
117  return SUM;
118  }
119  else if (s == "StandardDeviation")
120  {
121  return STANDARD_DEVIATION;
122  }
123  else if (s == "Variance")
124  {
125  return VARIANCE;
126  }
127  else if (s == "Median")
128  {
129  return MEDIAN;
130  }
131  else if (s == "MaximumIndex")
132  {
133  return MAXIMUM_INDEX;
134  }
135  else if (s == "MinimumIndex")
136  {
137  return MINIMUM_INDEX;
138  }
139  else if (s == "CenterOfGravity")
140  {
141  return CENTER_OF_GRAVITY;
142  }
143  /*
144  else if( s == "CentralMoments" )
145  {
146  return CENTRAL_MOMENTS;
147  }
148  */
149  else if (s == "WeightedPrincipalMoments")
150  {
151  return WEIGHTED_PRINCIPAL_MOMENTS;
152  }
153  else if (s == "WeightedPrincipalAxes")
154  {
155  return WEIGHTED_PRINCIPAL_AXES;
156  }
157  else if (s == "Kurtosis")
158  {
159  return KURTOSIS;
160  }
161  else if (s == "Skewness")
162  {
163  return SKEWNESS;
164  }
165  else if (s == "WeightedElongation")
166  {
167  return WEIGHTED_ELONGATION;
168  }
169  else if (s == "Histogram")
170  {
171  return HISTOGRAM;
172  }
173  else if (s == "WeightedFlatness")
174  {
175  return WEIGHTED_FLATNESS;
176  }
177  // can't recognize the name
178  return Superclass::GetAttributeFromName(s);
179  }
180 
181  static std::string
182  GetNameFromAttribute(const AttributeType & a)
183  {
184  switch (a)
185  {
186  case MINIMUM:
187  return "Minimum";
188  case MAXIMUM:
189  return "Maximum";
190  case MEAN:
191  return "Mean";
192  case SUM:
193  return "Sum";
194  case STANDARD_DEVIATION:
195  return "StandardDeviation";
196  case VARIANCE:
197  return "Variance";
198  case MEDIAN:
199  return "Median";
200  case MAXIMUM_INDEX:
201  return "MaximumIndex";
202  case MINIMUM_INDEX:
203  return "MinimumIndex";
204  case CENTER_OF_GRAVITY:
205  return "CenterOfGravity";
206  /* case CENTRAL_MOMENTS:
207  return "CentralMoments";*/
208  case WEIGHTED_PRINCIPAL_MOMENTS:
209  return "WeightedPrincipalMoments";
210  case WEIGHTED_PRINCIPAL_AXES:
211  return "WeightedPrincipalAxes";
212  case KURTOSIS:
213  return "Kurtosis";
214  case SKEWNESS:
215  return "Skewness";
216  case WEIGHTED_ELONGATION:
217  return "WeightedElongation";
218  case HISTOGRAM:
219  return "Histogram";
220  case WEIGHTED_FLATNESS:
221  return "WeightedFlatness";
222  }
223  // can't recognize the name
224  return Superclass::GetNameFromAttribute(a);
225  }
226 
228 
229  using typename Superclass::CentroidType;
230 
231  template <typename TSourceLabelObject>
232  void
233  CopyAttributesFrom(const TSourceLabelObject * src)
234  {
235  Superclass::template CopyAttributesFrom<TSourceLabelObject>(src);
236 
237  m_Minimum = src->GetMinimum();
238  m_Maximum = src->GetMaximum();
239  m_Mean = src->GetMean();
240  m_Sum = src->GetSum();
241  m_StandardDeviation = src->GetStandardDeviation();
242  m_Variance = src->GetVariance();
243  m_Median = src->GetMedian();
244  m_MaximumIndex = src->GetMaximumIndex();
245  m_MinimumIndex = src->GetMinimumIndex();
246  m_CenterOfGravity = src->GetCenterOfGravity();
247  // m_CentralMoments = src->GetCentralMoments();
248  m_WeightedPrincipalMoments = src->GetWeightedPrincipalMoments();
249  m_WeightedPrincipalAxes = src->GetWeightedPrincipalAxes();
250  m_Kurtosis = src->GetKurtosis();
251  m_Skewness = src->GetSkewness();
252  m_WeightedElongation = src->GetWeightedElongation();
253  m_Histogram = src->GetHistogram();
254  m_WeightedFlatness = src->GetWeightedFlatness();
255  }
256 
257  template <typename TSourceLabelObject>
258  void
259  CopyAllFrom(const TSourceLabelObject * src)
260  {
261  itkAssertOrThrowMacro((src != nullptr), "Null Pointer");
262  this->template CopyLinesFrom<TSourceLabelObject>(src);
263  this->template CopyAttributesFrom<TSourceLabelObject>(src);
264  }
265 
266  const double &
267  GetMinimum() const
268  {
269  return m_Minimum;
270  }
271 
272  void
273  SetMinimum(const double v)
274  {
275  m_Minimum = v;
276  }
277 
278  const double &
279  GetMaximum() const
280  {
281  return m_Maximum;
282  }
283 
284  void
285  SetMaximum(const double v)
286  {
287  m_Maximum = v;
288  }
289 
290  const double &
291  GetMean() const
292  {
293  return m_Mean;
294  }
295 
296  void
297  SetMean(const double v)
298  {
299  m_Mean = v;
300  }
301 
302  const double &
303  GetSum() const
304  {
305  return m_Sum;
306  }
307 
308  void
309  SetSum(const double v)
310  {
311  m_Sum = v;
312  }
313 
314  const double &
316  {
317  return m_StandardDeviation;
318  }
319 
320  void
321  SetStandardDeviation(const double v)
322  {
323  m_StandardDeviation = v;
324  }
325 
326  const double &
327  GetVariance() const
328  {
329  return m_Variance;
330  }
331 
332  void
333  SetVariance(const double v)
334  {
335  m_Variance = v;
336  }
337 
338  const double &
339  GetMedian() const
340  {
341  return m_Median;
342  }
343 
344  void
345  SetMedian(const double v)
346  {
347  m_Median = v;
348  }
349 
350  const IndexType &
352  {
353  return m_MaximumIndex;
354  }
355 
356  void
358  {
359  m_MaximumIndex = v;
360  }
361 
362  const IndexType &
364  {
365  return m_MinimumIndex;
366  }
367 
368  void
370  {
371  m_MinimumIndex = v;
372  }
373 
374  const PointType &
376  {
377  return m_CenterOfGravity;
378  }
379 
380  void
382  {
383  m_CenterOfGravity = v;
384  }
385 
386  /*
387  const MatrixType & GetCentralMoments() const
388  {
389  return m_CentralMoments;
390  }
391 
392  void SetCentralMoments( const MatrixType & v )
393  {
394  m_CentralMoments = v;
395  }*/
396 
397  const VectorType &
399  {
400  return m_WeightedPrincipalMoments;
401  }
402 
403  void
405  {
406  m_WeightedPrincipalMoments = v;
407  }
408 
409  const MatrixType &
411  {
412  return m_WeightedPrincipalAxes;
413  }
414 
415  void
417  {
418  m_WeightedPrincipalAxes = v;
419  }
420 
421  const double &
422  GetSkewness() const
423  {
424  return m_Skewness;
425  }
426 
427  void
428  SetSkewness(const double v)
429  {
430  m_Skewness = v;
431  }
432 
433  const double &
434  GetKurtosis() const
435  {
436  return m_Kurtosis;
437  }
438 
439  void
440  SetKurtosis(const double v)
441  {
442  m_Kurtosis = v;
443  }
444 
445  const double &
447  {
448  return m_WeightedElongation;
449  }
450 
451  void
452  SetWeightedElongation(const double v)
453  {
454  m_WeightedElongation = v;
455  }
456 
457  const HistogramType *
458  GetHistogram() const
459  {
460  return m_Histogram;
461  }
462 
463  void
465  {
466  m_Histogram = v;
467  }
468 
469  const double &
471  {
472  return m_WeightedFlatness;
473  }
474 
475  void
476  SetWeightedFlatness(const double v)
477  {
478  m_WeightedFlatness = v;
479  }
480 
481  // some helper methods - not really required, but really useful!
485 
491  {
492  typename AffineTransformType::MatrixType matrix;
493  typename AffineTransformType::OffsetType offset;
494  for (unsigned int i = 0; i < ImageDimension; ++i)
495  {
496  offset[i] = m_CenterOfGravity[i];
497  for (unsigned int j = 0; j < ImageDimension; ++j)
498  {
499  matrix[j][i] = m_WeightedPrincipalAxes[i][j]; // Note the transposition
500  }
501  }
505 
506  result->SetMatrix(matrix);
507  result->SetOffset(offset);
508 
509  return result;
510  }
511 
516  AffineTransformPointer
518  {
519  typename AffineTransformType::MatrixType matrix;
520  typename AffineTransformType::OffsetType offset;
521  for (unsigned int i = 0; i < ImageDimension; ++i)
522  {
523  offset[i] = m_CenterOfGravity[i];
524  for (unsigned int j = 0; j < ImageDimension; ++j)
525  {
526  matrix[j][i] = m_WeightedPrincipalAxes[i][j]; // Note the transposition
527  }
528  }
532  result->SetMatrix(matrix);
533  result->SetOffset(offset);
534 
536  result->GetInverse(inverse);
537 
538  return inverse;
539  }
540 
541 protected:
543  {
544  m_Minimum = 0;
545  m_Maximum = 0;
546  m_Mean = 0;
547  m_Sum = 0;
548  m_StandardDeviation = 0;
549  m_Variance = 0;
550  m_Median = 0;
551  m_MaximumIndex.Fill(0);
552  m_MinimumIndex.Fill(0);
553  m_CenterOfGravity.Fill(0);
554  // m_CentralMoments.Fill(0);
555  m_WeightedPrincipalMoments.Fill(0);
556  m_WeightedPrincipalAxes.Fill(0);
557  m_Kurtosis = 0;
558  m_Skewness = 0;
559  m_WeightedElongation = 0;
560  m_Histogram = nullptr;
561  m_WeightedFlatness = 0;
562  }
563 
564  void
565  PrintSelf(std::ostream & os, Indent indent) const override
566  {
567  Superclass::PrintSelf(os, indent);
568 
569  os << indent << "Minimum: " << m_Minimum << std::endl;
570  os << indent << "Maximum: " << m_Maximum << std::endl;
571  os << indent << "Mean: " << m_Mean << std::endl;
572  os << indent << "Sum: " << m_Sum << std::endl;
573  os << indent << "StandardDeviation: " << m_StandardDeviation << std::endl;
574  os << indent << "Variance: " << m_Variance << std::endl;
575  os << indent << "Median: " << m_Median << std::endl;
576  os << indent << "Skewness: " << m_Skewness << std::endl;
577  os << indent << "Kurtosis: " << m_Kurtosis << std::endl;
578  os << indent << "WeightedElongation: " << m_WeightedElongation << std::endl;
579  os << indent << "WeightedFlatness: " << m_WeightedFlatness << std::endl;
580  os << indent << "MaximumIndex: " << m_MaximumIndex << std::endl;
581  os << indent << "MinimumIndex: " << m_MinimumIndex << std::endl;
582  os << indent << "CenterOfGravity: " << m_CenterOfGravity << std::endl;
583  // os << indent << "CentralMoments: " << std::endl << m_CentralMoments;
584  os << indent << "WeightedPrincipalMoments: " << m_WeightedPrincipalMoments << std::endl;
585  os << indent << "WeightedPrincipalAxes: " << std::endl << m_WeightedPrincipalAxes;
586  itkPrintSelfObjectMacro(Histogram);
587  }
588 
589 private:
590  double m_Minimum{};
591  double m_Maximum{};
592  double m_Mean{};
593  double m_Sum{};
594  double m_StandardDeviation{};
595  double m_Variance{};
596  double m_Median{};
597  IndexType m_MaximumIndex{};
598  IndexType m_MinimumIndex{};
599  PointType m_CenterOfGravity{};
600  // MatrixType m_CentralMoments;
601  VectorType m_WeightedPrincipalMoments{};
602  MatrixType m_WeightedPrincipalAxes{};
603  double m_Skewness{};
604  double m_Kurtosis{};
605  double m_WeightedElongation{};
606 
607  typename HistogramType::ConstPointer m_Histogram{};
608 
609  double m_WeightedFlatness{};
610 };
611 } // end namespace itk
612 
613 #endif
itk::StatisticsLabelObject::GetKurtosis
const double & GetKurtosis() const
Definition: itkStatisticsLabelObject.h:434
Pointer
SmartPointer< Self > Pointer
Definition: itkAddImageFilter.h:93
itk::StatisticsLabelObject::SetMedian
void SetMedian(const double v)
Definition: itkStatisticsLabelObject.h:345
itk::StatisticsLabelObject::SetWeightedPrincipalAxes
void SetWeightedPrincipalAxes(const MatrixType &v)
Definition: itkStatisticsLabelObject.h:416
itk::StatisticsLabelObject::GetWeightedPrincipalAxes
const MatrixType & GetWeightedPrincipalAxes() const
Definition: itkStatisticsLabelObject.h:410
itk::StatisticsLabelObject::SetHistogram
void SetHistogram(const HistogramType *v)
Definition: itkStatisticsLabelObject.h:464
itk::StatisticsLabelObject::GetAttributeFromName
static AttributeType GetAttributeFromName(const std::string &s)
Definition: itkStatisticsLabelObject.h:101
itk::StatisticsLabelObject::GetPhysicalAxesToWeightedPrincipalAxesTransform
AffineTransformPointer GetPhysicalAxesToWeightedPrincipalAxesTransform() const
Definition: itkStatisticsLabelObject.h:517
itk::ImageRegion
An image region represents a structured region of data.
Definition: itkImageRegion.h:80
itk::StatisticsLabelObject::SetMean
void SetMean(const double v)
Definition: itkStatisticsLabelObject.h:297
itk::ShapeLabelObject::AffineTransformPointer
typename AffineTransformType::Pointer AffineTransformPointer
Definition: itkShapeLabelObject.h:627
itk::GTest::TypedefsAndConstructors::Dimension2::VectorType
ImageBaseType::SpacingType VectorType
Definition: itkGTestTypedefsAndConstructors.h:53
itk::GTest::TypedefsAndConstructors::Dimension2::PointType
ImageBaseType::PointType PointType
Definition: itkGTestTypedefsAndConstructors.h:51
itk::Vector< double, VImageDimension >
itk::StatisticsLabelObject::SetWeightedFlatness
void SetWeightedFlatness(const double v)
Definition: itkStatisticsLabelObject.h:476
itk::StatisticsLabelObject
A Label object to store the common attributes related to the statistics of the object.
Definition: itkStatisticsLabelObject.h:41
itk::StatisticsLabelObject::CopyAttributesFrom
void CopyAttributesFrom(const TSourceLabelObject *src)
Definition: itkStatisticsLabelObject.h:233
itk::SmartPointer< Self >
itk::StatisticsLabelObject::SetMaximum
void SetMaximum(const double v)
Definition: itkStatisticsLabelObject.h:285
itk::Indent
Control indentation during Print() invocation.
Definition: itkIndent.h:49
itk::AffineTransform
Definition: itkAffineTransform.h:101
itk::StatisticsLabelObject::PrintSelf
void PrintSelf(std::ostream &os, Indent indent) const override
Definition: itkStatisticsLabelObject.h:565
itk::StatisticsLabelObject::SetMinimum
void SetMinimum(const double v)
Definition: itkStatisticsLabelObject.h:273
itk::StatisticsLabelObject::GetMaximumIndex
const IndexType & GetMaximumIndex() const
Definition: itkStatisticsLabelObject.h:351
itk::LabelMap
Templated n-dimensional image to store labeled objects.
Definition: itkLabelMap.h:70
itk::StatisticsLabelObject::StatisticsLabelObject
StatisticsLabelObject()
Definition: itkStatisticsLabelObject.h:542
itkShapeLabelObject.h
itk::GTest::TypedefsAndConstructors::Dimension2::IndexType
ImageBaseType::IndexType IndexType
Definition: itkGTestTypedefsAndConstructors.h:50
itk::StatisticsLabelObject::GetStandardDeviation
const double & GetStandardDeviation() const
Definition: itkStatisticsLabelObject.h:315
itk::Statistics::Histogram
This class stores measurement vectors in the context of n-dimensional histogram.
Definition: itkHistogram.h:77
itk::StatisticsLabelObject::GetWeightedPrincipalMoments
const VectorType & GetWeightedPrincipalMoments() const
Definition: itkStatisticsLabelObject.h:398
itk::StatisticsLabelObject::SetWeightedElongation
void SetWeightedElongation(const double v)
Definition: itkStatisticsLabelObject.h:452
itk::LightObject
Light weight base class for most itk classes.
Definition: itkLightObject.h:55
itk::StatisticsLabelObject::GetWeightedElongation
const double & GetWeightedElongation() const
Definition: itkStatisticsLabelObject.h:446
itk::StatisticsLabelObject::GetCenterOfGravity
const PointType & GetCenterOfGravity() const
Definition: itkStatisticsLabelObject.h:375
itkHistogram.h
itk::StatisticsLabelObject::GetMaximum
const double & GetMaximum() const
Definition: itkStatisticsLabelObject.h:279
itk::StatisticsLabelObject::GetMinimum
const double & GetMinimum() const
Definition: itkStatisticsLabelObject.h:267
itk::StatisticsLabelObject::GetMedian
const double & GetMedian() const
Definition: itkStatisticsLabelObject.h:339
itk::StatisticsLabelObject::GetHistogram
const HistogramType * GetHistogram() const
Definition: itkStatisticsLabelObject.h:458
itk::StatisticsLabelObject::SetWeightedPrincipalMoments
void SetWeightedPrincipalMoments(const VectorType &v)
Definition: itkStatisticsLabelObject.h:404
itk::StatisticsLabelObject::GetSum
const double & GetSum() const
Definition: itkStatisticsLabelObject.h:303
itk::StatisticsLabelObject::GetVariance
const double & GetVariance() const
Definition: itkStatisticsLabelObject.h:327
itk::StatisticsLabelObject::SetMinimumIndex
void SetMinimumIndex(const IndexType &v)
Definition: itkStatisticsLabelObject.h:369
itk::StatisticsLabelObject::GetWeightedFlatness
const double & GetWeightedFlatness() const
Definition: itkStatisticsLabelObject.h:470
itk::StatisticsLabelObject::SetKurtosis
void SetKurtosis(const double v)
Definition: itkStatisticsLabelObject.h:440
itk::LabelObject::LabelType
TLabel LabelType
Definition: itkLabelObject.h:89
itk::Matrix< double, VImageDimension, VImageDimension >
itk::StatisticsLabelObject::SetSkewness
void SetSkewness(const double v)
Definition: itkStatisticsLabelObject.h:428
itk::WeakPointer
Implements a weak reference to an object.
Definition: itkWeakPointer.h:44
itk::StatisticsLabelObject::GetWeightedPrincipalAxesToPhysicalAxesTransform
AffineTransformPointer GetWeightedPrincipalAxesToPhysicalAxesTransform() const
Definition: itkStatisticsLabelObject.h:490
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itk::ShapeLabelObject
A Label object to store the common attributes related to the shape of the object.
Definition: itkShapeLabelObject.h:43
itk::StatisticsLabelObject::GetMean
const double & GetMean() const
Definition: itkStatisticsLabelObject.h:291
itk::StatisticsLabelObject::GetNameFromAttribute
static std::string GetNameFromAttribute(const AttributeType &a)
Definition: itkStatisticsLabelObject.h:182
itk::StatisticsLabelObject::GetMinimumIndex
const IndexType & GetMinimumIndex() const
Definition: itkStatisticsLabelObject.h:363
itk::StatisticsLabelObject::SetSum
void SetSum(const double v)
Definition: itkStatisticsLabelObject.h:309
itk::Point< double, Self::ImageDimension >
itk::StatisticsLabelObject::SetMaximumIndex
void SetMaximumIndex(const IndexType &v)
Definition: itkStatisticsLabelObject.h:357
itk::StatisticsLabelObject::SetVariance
void SetVariance(const double v)
Definition: itkStatisticsLabelObject.h:333
New
static Pointer New()
itk::StatisticsLabelObject::CopyAllFrom
void CopyAllFrom(const TSourceLabelObject *src)
Definition: itkStatisticsLabelObject.h:259
itk::StatisticsLabelObject::SetStandardDeviation
void SetStandardDeviation(const double v)
Definition: itkStatisticsLabelObject.h:321
itk::StatisticsLabelObject::GetSkewness
const double & GetSkewness() const
Definition: itkStatisticsLabelObject.h:422
itk::StatisticsLabelObject::SetCenterOfGravity
void SetCenterOfGravity(const PointType &v)
Definition: itkStatisticsLabelObject.h:381