00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkHistogram_h
00018
#define __itkHistogram_h
00019
00020
#include <vector>
00021
00022
#include "itkIndex.h"
00023
#include "itkSize.h"
00024
#include "itkFixedArray.h"
00025
#include "itkSample.h"
00026
#include "itkDenseFrequencyContainer.h"
00027
#include "itkSparseFrequencyContainer.h"
00028
00029
namespace itk{
00030
namespace Statistics{
00031
00063
template <
class TMeasurement =
float,
unsigned int VMeasurementVectorSize = 1,
00064
class TFrequencyContainer = DenseFrequencyContainer< float > >
00065 class ITK_EXPORT Histogram
00066 :
public Sample < FixedArray< TMeasurement, VMeasurementVectorSize > >
00067 {
00068
public:
00070 typedef Histogram
Self ;
00071 typedef Sample< FixedArray< TMeasurement, VMeasurementVectorSize > >
Superclass ;
00072 typedef SmartPointer<Self> Pointer ;
00073
00075
itkTypeMacro(Histogram,
Sample) ;
00076
00078
itkNewMacro(
Self) ;
00079
00081
itkStaticConstMacro(MeasurementVectorSize,
unsigned int,
00082 VMeasurementVectorSize);
00083
00085 typedef TMeasurement
MeasurementType ;
00086
00088 typedef typename Superclass::MeasurementVectorType
MeasurementVectorType ;
00089 typedef typename Superclass::InstanceIdentifier
InstanceIdentifier ;
00090 typedef MeasurementVectorType ValueType ;
00091
00093 typedef TFrequencyContainer
FrequencyContainerType ;
00094 typedef typename FrequencyContainerType::Pointer
FrequencyContainerPointer ;
00095
00097 typedef typename FrequencyContainerType::FrequencyType
FrequencyType ;
00098
00100 typedef itk::Index< VMeasurementVectorSize > IndexType;
00101 typedef typename IndexType::IndexValueType
IndexValueType;
00102
00104 typedef itk::Size< VMeasurementVectorSize > SizeType ;
00105 typedef typename SizeType::SizeValueType
SizeValueType ;
00106
00108 typedef std::vector< MeasurementType >
BinMinVectorType ;
00109 typedef std::vector< MeasurementType >
BinMaxVectorType ;
00110 typedef std::vector< BinMinVectorType >
BinMinContainerType ;
00111 typedef std::vector< BinMaxVectorType >
BinMaxContainerType ;
00112
00117
void Initialize(
const SizeType &size) ;
00118
00119
00125
void Initialize(
const SizeType &size,
MeasurementVectorType& lowerBound,
00126
MeasurementVectorType& upperBound) ;
00127
00129
IndexType& GetIndex(
const MeasurementVectorType& measurement) ;
00130
00134
IndexType& GetIndex(
const InstanceIdentifier &
id) ;
00135
00138
bool IsIndexOutOfBounds(
const IndexType &index)
const;
00139
00143
InstanceIdentifier GetInstanceIdentifier(
const IndexType &index)
const ;
00144
00146
unsigned int Size() const ;
00147
00149 SizeType GetSize()
const
00150
{
return m_Size ; }
00151
00153 SizeValueType GetSize(
const unsigned int dimension)
const
00154
{
00155
return m_Size[dimension] ;
00156 }
00157
00159 MeasurementType& GetBinMin(
const unsigned int dimension,
00160
const unsigned long nbin)
00161 {
return m_Min[dimension][nbin] ; }
00162
00164 MeasurementType& GetBinMax(
const unsigned int dimension,
00165
const unsigned long nbin)
00166 {
return m_Max[dimension][nbin] ; }
00167
00169 void SetBinMin(
const unsigned int dimension,
const unsigned long nbin,
00170
const MeasurementType min)
00171 { m_Min[dimension][nbin] = min ; }
00172
00174 void SetBinMax(
const unsigned int dimension,
00175
unsigned long nbin,
const MeasurementType max)
00176 { m_Max[dimension][nbin] = max ; }
00177
00180 MeasurementType& GetBinMinFromValue(
const unsigned int dimension,
00181
const float value )
const ;
00182
00185 MeasurementType& GetBinMaxFromValue(
const unsigned int dimension,
00186
const float value )
const ;
00187
00189 BinMinVectorType& GetDimensionMins(
const unsigned int dimension)
const
00190
{
return m_Min[dimension] ; }
00191
00193 BinMaxVectorType& GetDimensionMaxs(
const unsigned int dimension)
const
00194
{
return m_Max[dimension] ; }
00195
00197 BinMinContainerType& GetMins()
const
00198
{
return m_Min ; }
00199
00201 BinMaxContainerType& GetMaxs()
const
00202
{
return m_Max ; }
00203
00205 MeasurementVectorType& GetHistogramMinFromValue(
const MeasurementVectorType
00206 &measurement) ;
00207
00209 MeasurementVectorType& GetHistogramMaxFromValue(
const MeasurementVectorType
00210 &measurement) ;
00211
00213 MeasurementVectorType& GetHistogramMinFromIndex(
const IndexType &index) ;
00214
00216 MeasurementVectorType& GetHistogramMaxFromIndex(
const IndexType &index) ;
00217
00219 FrequencyType GetFrequency(
const InstanceIdentifier &
id)
const
00220
{
return m_FrequencyContainer->GetFrequency(
id) ; }
00221
00223 FrequencyType GetFrequency(
const IndexType &index)
const ;
00224
00226
void SetFrequency(
const FrequencyType value) ;
00227
00229 void SetFrequency(
const InstanceIdentifier &
id,
const FrequencyType value)
00230 { m_FrequencyContainer->SetFrequency(
id, value) ; }
00231
00233
void SetFrequency(
const IndexType &index,
00234
const FrequencyType value) ;
00235
00237
void SetFrequency(
const MeasurementVectorType &measurement,
00238
const FrequencyType value) ;
00239
00240
00243 void IncreaseFrequency(
const InstanceIdentifier &
id,
00244
const FrequencyType value)
00245 { m_FrequencyContainer->IncreaseFrequency(
id, value) ; }
00246
00249
void IncreaseFrequency(
const IndexType &index,
00250
const FrequencyType value) ;
00251
00254
void IncreaseFrequency(
const MeasurementVectorType &measurement,
00255
const FrequencyType value) ;
00256
00258 MeasurementVectorType GetMeasurementVector(
const InstanceIdentifier &
id) ;
00259
00261 MeasurementVectorType GetMeasurementVector(
const IndexType &index) ;
00262
00264 MeasurementType GetMeasurement(
const unsigned long n,
00265
const unsigned int dimension)
const ;
00266
00268 FrequencyType GetTotalFrequency() const ;
00269
00271 FrequencyType GetFrequency(const
unsigned long n,
00272 const
unsigned int dimension) const ;
00273
00288
double Quantile(const
unsigned int dimension, const
double &p) ;
00289
00291 class Iterator ;
00292 friend class Iterator ;
00293
00294 Iterator Begin()
00295 {
00296 Iterator iter(0,
this) ;
00297
return iter ;
00298 }
00299
00300 Iterator End()
00301 {
00302
return Iterator(m_OffsetTable[VMeasurementVectorSize],
this) ;
00303 }
00304
00305
00306
class Iterator
00307 {
00308
public:
00309
Iterator(){};
00310
00311
Iterator(
Pointer histogram)
00312 {
00313 m_Id = 0 ;
00314 m_Histogram = histogram;
00315 }
00316
00317
Iterator(
InstanceIdentifier id,
Pointer histogram)
00318 : m_Id(id), m_Histogram(histogram)
00319 {}
00320
00321
FrequencyType GetFrequency()
const
00322 {
00323
return m_Histogram->GetFrequency(m_Id) ;
00324 }
00325
00326
void SetFrequency(
const FrequencyType value)
00327 {
00328 m_Histogram->SetFrequency(m_Id, value);
00329 }
00330
00331
InstanceIdentifier GetInstanceIdentifier()
const
00332 {
return m_Id ; }
00333
00334
MeasurementVectorType GetMeasurementVector()
const
00335 {
00336
return m_Histogram->GetMeasurementVector(m_Id) ;
00337 }
00338
00339
Iterator& operator++()
00340 {
00341 ++m_Id;
00342
return *
this;
00343 }
00344
00345
bool operator!=(
const Iterator& it)
00346 {
return (m_Id != it.
m_Id); }
00347
00348
bool operator==(
const Iterator& it)
00349 {
return (m_Id == it.
m_Id); }
00350
00351
Iterator& operator=(
const Iterator& it)
00352 {
00353 m_Id = it.
m_Id;
00354 m_Histogram = it.
m_Histogram ;
00355
return *
this ;
00356 }
00357
00358
Iterator(
const Iterator& it)
00359 {
00360 m_Id = it.
m_Id;
00361 m_Histogram = it.
m_Histogram ;
00362 }
00363
00364
private:
00365
00366
InstanceIdentifier m_Id;
00367
00368
00369
Self* m_Histogram ;
00370 } ;
00371
00372
protected:
00373 Histogram() ;
00374
virtual ~Histogram() {}
00375 void PrintSelf(std::ostream& os,
Indent indent)
const;
00376
00377
00378
SizeType m_Size ;
00379
00380
00381 std::vector< std::vector<MeasurementType> > m_Min ;
00382
00383
00384 std::vector< std::vector<MeasurementType> > m_Max ;
00385
00386
private:
00387 Histogram(
const Self&);
00388
void operator=(
const Self&);
00389
00390
InstanceIdentifier m_OffsetTable[VMeasurementVectorSize + 1] ;
00391
FrequencyContainerPointer m_FrequencyContainer ;
00392
unsigned int m_NumberOfInstances ;
00393
MeasurementVectorType m_TempMeasurementVector ;
00394
IndexType m_TempIndex ;
00395 } ;
00396
00397 }
00398 }
00399
00400
#ifndef ITK_MANUAL_INSTANTIATION
00401
#include "itkHistogram.txx"
00402
#endif
00403
00404
#endif