ITK  4.9.0
Insight Segmentation and Registration Toolkit
itkHistogram.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright Insight Software Consortium
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  * http://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 itkHistogram_h
19 #define itkHistogram_h
20 
21 #include <vector>
22 
23 #include "itkArray.h"
24 #include "itkSample.h"
27 
28 namespace itk
29 {
30 namespace Statistics
31 {
32 
75 template< typename TMeasurement = float,
76  typename TFrequencyContainer = DenseFrequencyContainer2 >
77 class Histogram:
78  public Sample< Array< TMeasurement > >
79 {
80 public:
81 
82  // This type serves as the indirect definition of MeasurementVectorType
84 
86  typedef Histogram Self;
90 
92  itkTypeMacro(Histogram, Sample);
93 
95  itkNewMacro(Self);
96 
98  typedef TMeasurement MeasurementType;
99 
104 
106 
108  typedef TFrequencyContainer FrequencyContainerType;
109  typedef typename FrequencyContainerType::Pointer FrequencyContainerPointer;
110 
112  typedef typename FrequencyContainerType::AbsoluteFrequencyType AbsoluteFrequencyType;
113  typedef typename FrequencyContainerType::TotalAbsoluteFrequencyType TotalAbsoluteFrequencyType;
114  typedef typename FrequencyContainerType::RelativeFrequencyType RelativeFrequencyType;
115  typedef typename FrequencyContainerType::TotalRelativeFrequencyType TotalRelativeFrequencyType;
116 
120 
124 
126  typedef std::vector< MeasurementType > BinMinVectorType;
127  typedef std::vector< MeasurementType > BinMaxVectorType;
128  typedef std::vector< BinMinVectorType > BinMinContainerType;
129  typedef std::vector< BinMaxVectorType > BinMaxContainerType;
130 
134  void Initialize(const SizeType & size);
135 
139  void Initialize(const SizeType & size, MeasurementVectorType & lowerBound,
140  MeasurementVectorType & upperBound);
141 
143  void SetToZero();
144 
148  itkLegacyMacro(const IndexType & GetIndex(const MeasurementVectorType & measurement) const);
149 
153  bool GetIndex(const MeasurementVectorType & measurement,
154  IndexType & index) const;
155 
159  const IndexType & GetIndex(InstanceIdentifier id) const;
160 
163  itkGetConstMacro(ClipBinsAtEnds, bool);
164 
167  itkSetMacro(ClipBinsAtEnds, bool);
168 
171  bool IsIndexOutOfBounds(const IndexType & index) const;
172 
177 
179  InstanceIdentifier Size() const ITK_OVERRIDE;
180 
182  const SizeType & GetSize() const;
183 
185  SizeValueType GetSize(unsigned int dimension) const;
186 
188  const MeasurementType & GetBinMin(unsigned int dimension,
189  InstanceIdentifier nbin) const;
190 
192  const MeasurementType & GetBinMax(unsigned int dimension,
193  InstanceIdentifier nbin) const;
194 
196  void SetBinMin(unsigned int dimension, InstanceIdentifier nbin,
197  MeasurementType min);
198 
200  void SetBinMax(unsigned int dimension,
202 
205  const MeasurementType & GetBinMinFromValue(unsigned int dimension,
206  float value) const;
207 
210  const MeasurementType & GetBinMaxFromValue(unsigned int dimension,
211  float value) const;
212 
214  const BinMinVectorType & GetDimensionMins(unsigned int dimension) const;
215 
217  const BinMaxVectorType & GetDimensionMaxs(unsigned int dimension) const;
218 
220  const BinMinContainerType & GetMins() const;
221 
223  const BinMaxContainerType & GetMaxs() const;
224 
226  const MeasurementVectorType & GetHistogramMinFromIndex(const IndexType & index) const;
227 
229  const MeasurementVectorType & GetHistogramMaxFromIndex(const IndexType & index) const;
230 
233 
235  AbsoluteFrequencyType GetFrequency(const IndexType & index) const;
236 
239 
243 
246  bool SetFrequencyOfIndex(const IndexType & index,
247  AbsoluteFrequencyType value);
248 
251  bool SetFrequencyOfMeasurement(const MeasurementVectorType & measurement,
252  AbsoluteFrequencyType value);
253 
258 
262  bool IncreaseFrequencyOfIndex(const IndexType & index,
263  AbsoluteFrequencyType value);
264 
273  const MeasurementVectorType & measurement,
274  AbsoluteFrequencyType value);
275 #ifdef ITKV3_COMPATIBILITY
276  //In ITKv4 the member functions are given unique names to dis-ambiguate
277  //the intended behavior. Make aliases of the overloaded calls
278  //for ITKv3 backwards compatibility.
279  bool IncreaseFrequency(const IndexType & index,
280  AbsoluteFrequencyType value)
281  {
282  return IncreaseFrequencyOfIndex(index,value);
283  }
285 
286  bool IncreaseFrequency(
287  const MeasurementVectorType & measurement,
288  AbsoluteFrequencyType value)
289  {
290  return IncreaseFrequencyOfMeasurement(measurement,value);
291  }
292 
293 #endif
294 
298  const MeasurementVectorType & GetMeasurementVector(InstanceIdentifier id) const ITK_OVERRIDE;
299 
301  const MeasurementVectorType & GetMeasurementVector(const IndexType & index) const;
302 
306  unsigned int dimension) const;
307 
309  TotalAbsoluteFrequencyType GetTotalFrequency() const ITK_OVERRIDE;
310 
313  unsigned int dimension) const;
314 
330  double Quantile(unsigned int dimension, double p) const;
332 
334  double Mean(unsigned int dimension) const;
335 
337  virtual void Graft(const DataObject *) ITK_OVERRIDE;
338 
339 protected:
340  void PrintSelf(std::ostream & os, Indent indent) const ITK_OVERRIDE;
341 
342 public:
343 
349  {
350 public:
351 
352  friend class Histogram;
353 
354  ConstIterator(const Self *histogram)
355  {
356  m_Id = 0;
357  m_Histogram = histogram;
358  }
359 
360  ConstIterator(const ConstIterator & it)
361  {
362  m_Id = it.m_Id;
363  m_Histogram = it.m_Histogram;
364  }
365 
366  ConstIterator & operator=(const ConstIterator & it)
367  {
368  m_Id = it.m_Id;
369  m_Histogram = it.m_Histogram;
370  return *this;
371  }
372 
374  {
375  return m_Histogram->GetFrequency(m_Id);
376  }
377 
379  {
380  return m_Id;
381  }
382 
384  {
385  return m_Histogram->GetMeasurementVector(m_Id);
386  }
387 
388  const IndexType & GetIndex() const
389  {
390  return m_Histogram->GetIndex(m_Id);
391  }
392 
393  ConstIterator & operator++()
394  {
395  ++m_Id;
396  return *this;
397  }
398 
399  bool operator!=(const ConstIterator & it)
400  {
401  return ( m_Id != it.m_Id );
402  }
403 
404  bool operator==(const ConstIterator & it)
405  {
406  return ( m_Id == it.m_Id );
407  }
408 
409 protected:
410  ConstIterator() ITK_DELETE_FUNCTION;
411 
412  ConstIterator(InstanceIdentifier id, const Self *histogram):
413  m_Id(id), m_Histogram(histogram)
414  {}
415 
416  // ConstIterator pointing DenseFrequencyContainer
418 
419  // Pointer of DenseFrequencyContainer
421  }; // end of iterator class
422 
427  class Iterator:public ConstIterator
428  {
429 public:
430 
431  Iterator(Self *histogram):ConstIterator(histogram)
432  {}
433 
435  ConstIterator(id, histogram)
436  {}
437 
439  {}
440 
442  {
443  this->ConstIterator::operator=(it);
444  return *this;
445  }
446 
448  {
449  Self *histogram = const_cast< Self * >( this->m_Histogram );
450 
451  return histogram->SetFrequency(this->m_Id, value);
452  }
453 
454 protected:
455  // To ensure const-correctness these method must not be in the public API.
456  // The are not implemented, since they should never be called.
457  Iterator(); //purposly not implemented
458  Iterator(const Self *histogram); //purposly not implemented
459  Iterator(InstanceIdentifier id, const Self *histogram); //purposly not implemented
460  Iterator(const ConstIterator & it); //purposly not implemented
461  ConstIterator & operator=(const ConstIterator & it); //purposly not implemented
462 
463 private:
464  }; // end of iterator class
465 
467  {
468  Iterator iter(0, this);
469 
470  return iter;
471  }
472 
474  {
475  return Iterator(m_OffsetTable[this->GetMeasurementVectorSize()], this);
476  }
477 
479  {
480  ConstIterator iter(0, this);
481 
482  return iter;
483  }
484 
486  {
488  }
489 
490 protected:
491  Histogram();
492  virtual ~Histogram() {}
493 
494  // The number of bins for each dimension
496 
497 private:
498  Histogram(const Self &) ITK_DELETE_FUNCTION;
499  void operator=(const Self &) ITK_DELETE_FUNCTION;
500 
501  typedef std::vector< InstanceIdentifier > OffsetTableType;
502  OffsetTableType m_OffsetTable;
504  unsigned int m_NumberOfInstances;
505 
506  // This method is provided here just to avoid a "hidden" warning
507  // related to the virtual method available in DataObject.
508  virtual void Initialize() ITK_OVERRIDE {}
509 
510  // lower bound of each bin
511  std::vector< std::vector< MeasurementType > > m_Min;
512 
513  // upper bound of each bin
514  std::vector< std::vector< MeasurementType > > m_Max;
515 
518 
520 };
521 } // end of namespace Statistics
522 } // end of namespace itk
523 
524 #ifndef ITK_MANUAL_INSTANTIATION
525 #include "itkHistogram.hxx"
526 #endif
527 
528 #endif
Sample< ArrayType > Superclass
Definition: itkHistogram.h:87
bool IsIndexOutOfBounds(const IndexType &index) const
Array class with size defined at construction time.
Definition: itkArray.h:50
IndexType::ValueType IndexValueType
Definition: itkHistogram.h:119
double Quantile(unsigned int dimension, double p) const
InstanceIdentifier Size() const override
::itk::IndexValueType ValueType
Definition: itkArray.h:55
SmartPointer< Self > Pointer
Definition: itkHistogram.h:88
bool IncreaseFrequencyOfMeasurement(const MeasurementVectorType &measurement, AbsoluteFrequencyType value)
MeasurementVectorTraits::InstanceIdentifier InstanceIdentifier
Definition: itkSample.h:89
ConstIterator End() const
Definition: itkHistogram.h:485
ConstIterator(const ConstIterator &it)
Definition: itkHistogram.h:360
class that walks through the elements of the histogram.
Definition: itkHistogram.h:348
itkLegacyMacro(const IndexType &GetIndex(const MeasurementVectorType &measurement) const)
const MeasurementVectorType & GetHistogramMaxFromIndex(const IndexType &index) const
void PrintSelf(std::ostream &os, Indent indent) const override
Superclass::InstanceIdentifier InstanceIdentifier
Definition: itkHistogram.h:102
std::vector< BinMinVectorType > BinMinContainerType
Definition: itkHistogram.h:128
const BinMinContainerType & GetMins() const
virtual void Graft(const DataObject *) override
This class stores measurement vectors in the context of n-dimensional histogram.
Definition: itkHistogram.h:77
InstanceIdentifier GetInstanceIdentifier(const IndexType &index) const
Superclass::MeasurementVectorSizeType MeasurementVectorSizeType
Definition: itkHistogram.h:103
bool IncreaseFrequency(InstanceIdentifier id, AbsoluteFrequencyType value)
FrequencyContainerType::AbsoluteFrequencyType AbsoluteFrequencyType
Definition: itkHistogram.h:112
TFrequencyContainer FrequencyContainerType
Definition: itkHistogram.h:108
AbsoluteFrequencyType GetFrequency(InstanceIdentifier id) const override
SmartPointer< const Self > ConstPointer
Definition: itkHistogram.h:89
virtual void Initialize() override
Definition: itkHistogram.h:508
bool SetFrequency(const AbsoluteFrequencyType value)
Definition: itkHistogram.h:447
const MeasurementVectorType & GetMeasurementVector() const
Definition: itkHistogram.h:383
const BinMaxContainerType & GetMaxs() const
const MeasurementType & GetBinMax(unsigned int dimension, InstanceIdentifier nbin) const
void SetBinMax(unsigned int dimension, InstanceIdentifier nbin, MeasurementType max)
const BinMinVectorType & GetDimensionMins(unsigned int dimension) const
std::vector< MeasurementType > BinMaxVectorType
Definition: itkHistogram.h:127
Array< ::itk::IndexValueType > IndexType
Definition: itkHistogram.h:118
MeasurementType GetMeasurement(InstanceIdentifier n, unsigned int dimension) const
std::vector< std::vector< MeasurementType > > m_Max
Definition: itkHistogram.h:514
std::vector< std::vector< MeasurementType > > m_Min
Definition: itkHistogram.h:511
const IndexType & GetIndex() const
Definition: itkHistogram.h:388
OffsetTableType m_OffsetTable
Definition: itkHistogram.h:502
ConstIterator & operator=(const ConstIterator &it)
Definition: itkHistogram.h:366
FrequencyContainerType::RelativeFrequencyType RelativeFrequencyType
Definition: itkHistogram.h:114
Iterator(InstanceIdentifier id, Self *histogram)
Definition: itkHistogram.h:434
const MeasurementType & GetBinMinFromValue(unsigned int dimension, float value) const
unsigned int m_NumberOfInstances
Definition: itkHistogram.h:504
MeasurementVectorType ValueType
Definition: itkHistogram.h:105
const MeasurementVectorType & GetHistogramMinFromIndex(const IndexType &index) const
Superclass::MeasurementVectorType MeasurementVectorType
Definition: itkHistogram.h:101
bool IncreaseFrequencyOfIndex(const IndexType &index, AbsoluteFrequencyType value)
const MeasurementVectorType & GetMeasurementVector(InstanceIdentifier id) const override
bool GetIndex(const MeasurementVectorType &measurement, IndexType &index) const
std::vector< BinMaxVectorType > BinMaxContainerType
Definition: itkHistogram.h:129
ConstIterator Begin() const
Definition: itkHistogram.h:478
Iterator & operator=(const Iterator &it)
Definition: itkHistogram.h:441
bool operator==(const ConstIterator &it)
Definition: itkHistogram.h:404
TMeasurement MeasurementType
Definition: itkHistogram.h:95
virtual MeasurementVectorSizeType GetMeasurementVectorSize() const
void SetBinMin(unsigned int dimension, InstanceIdentifier nbin, MeasurementType min)
MeasurementVectorType m_TempMeasurementVector
Definition: itkHistogram.h:516
TotalAbsoluteFrequencyType GetTotalFrequency() const override
FrequencyContainerPointer m_FrequencyContainer
Definition: itkHistogram.h:503
const MeasurementType & GetBinMin(unsigned int dimension, InstanceIdentifier nbin) const
TMeasurementVector MeasurementVectorType
Definition: itkSample.h:71
unsigned int MeasurementVectorSizeType
Definition: itkSample.h:92
double Mean(unsigned int dimension) const
const BinMaxVectorType & GetDimensionMaxs(unsigned int dimension) const
class that walks through the elements of the histogram.
Definition: itkHistogram.h:427
const MeasurementType & GetBinMaxFromValue(unsigned int dimension, float value) const
FrequencyContainerType::TotalAbsoluteFrequencyType TotalAbsoluteFrequencyType
Definition: itkHistogram.h:113
A collection of measurements for statistical analysis.
Definition: itkSample.h:61
Control indentation during Print() invocation.
Definition: itkIndent.h:49
std::vector< MeasurementType > BinMinVectorType
Definition: itkHistogram.h:126
FrequencyContainerType::Pointer FrequencyContainerPointer
Definition: itkHistogram.h:109
bool SetFrequencyOfIndex(const IndexType &index, AbsoluteFrequencyType value)
Array< ::itk::SizeValueType > SizeType
Definition: itkHistogram.h:122
void SetFrequency(AbsoluteFrequencyType value)
const SizeType & GetSize() const
bool SetFrequencyOfMeasurement(const MeasurementVectorType &measurement, AbsoluteFrequencyType value)
Base class for all data objects in ITK.
bool operator!=(const ConstIterator &it)
Definition: itkHistogram.h:399
AbsoluteFrequencyType GetFrequency() const
Definition: itkHistogram.h:373
Array< TMeasurement > ArrayType
Definition: itkHistogram.h:83
InstanceIdentifier GetInstanceIdentifier() const
Definition: itkHistogram.h:378
SizeType::ValueType SizeValueType
Definition: itkHistogram.h:123
std::vector< InstanceIdentifier > OffsetTableType
Definition: itkHistogram.h:501
FrequencyContainerType::TotalRelativeFrequencyType TotalRelativeFrequencyType
Definition: itkHistogram.h:115