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 typedef SmartPointer<const Self> ConstPointer ;
00074
00076
itkTypeMacro(Histogram,
Sample) ;
00077
00079
itkNewMacro(
Self) ;
00080
00082
itkStaticConstMacro(MeasurementVectorSize,
unsigned int,
00083 VMeasurementVectorSize);
00084
00086 typedef TMeasurement
MeasurementType ;
00087
00089 typedef typename Superclass::MeasurementVectorType
MeasurementVectorType ;
00090 typedef typename Superclass::InstanceIdentifier
InstanceIdentifier ;
00091 typedef MeasurementVectorType ValueType ;
00092
00094 typedef TFrequencyContainer
FrequencyContainerType ;
00095 typedef typename FrequencyContainerType::Pointer
FrequencyContainerPointer ;
00096
00098 typedef typename FrequencyContainerType::FrequencyType
FrequencyType ;
00099
00101 typedef itk::Index< VMeasurementVectorSize > IndexType;
00102 typedef typename IndexType::IndexValueType
IndexValueType;
00103
00105 typedef itk::Size< VMeasurementVectorSize > SizeType ;
00106 typedef typename SizeType::SizeValueType
SizeValueType ;
00107
00109 typedef std::vector< MeasurementType >
BinMinVectorType ;
00110 typedef std::vector< MeasurementType >
BinMaxVectorType ;
00111 typedef std::vector< BinMinVectorType >
BinMinContainerType ;
00112 typedef std::vector< BinMaxVectorType >
BinMaxContainerType ;
00113
00118
void Initialize(
const SizeType &size) ;
00119
00120
00126
void Initialize(
const SizeType &size,
MeasurementVectorType& lowerBound,
00127
MeasurementVectorType& upperBound) ;
00128
00130
const IndexType & GetIndex(
const MeasurementVectorType& measurement)
const;
00131
00135
const IndexType & GetIndex(
const InstanceIdentifier &
id)
const;
00136
00139
bool IsIndexOutOfBounds(
const IndexType &index)
const;
00140
00144
InstanceIdentifier GetInstanceIdentifier(
const IndexType &index)
const ;
00145
00147
unsigned int Size() const ;
00148
00150 SizeType GetSize()
const
00151
{
return m_Size ; }
00152
00154 SizeValueType GetSize(
const unsigned int dimension)
const
00155
{
00156
return m_Size[dimension] ;
00157 }
00158
00160 MeasurementType& GetBinMin(
const unsigned int dimension,
00161
const unsigned long nbin)
00162 {
return m_Min[dimension][nbin] ; }
00163
00165 MeasurementType& GetBinMax(
const unsigned int dimension,
00166
const unsigned long nbin)
00167 {
return m_Max[dimension][nbin] ; }
00168
00170 void SetBinMin(
const unsigned int dimension,
const unsigned long nbin,
00171
const MeasurementType min)
00172 { m_Min[dimension][nbin] = min ; }
00173
00175 void SetBinMax(
const unsigned int dimension,
00176
unsigned long nbin,
const MeasurementType max)
00177 { m_Max[dimension][nbin] = max ; }
00178
00181 MeasurementType& GetBinMinFromValue(
const unsigned int dimension,
00182
const float value )
const ;
00183
00186 MeasurementType& GetBinMaxFromValue(
const unsigned int dimension,
00187
const float value )
const ;
00188
00190 BinMinVectorType& GetDimensionMins(
const unsigned int dimension)
const
00191
{
return m_Min[dimension] ; }
00192
00194 BinMaxVectorType& GetDimensionMaxs(
const unsigned int dimension)
const
00195
{
return m_Max[dimension] ; }
00196
00198 BinMinContainerType& GetMins()
const
00199
{
return m_Min ; }
00200
00202 BinMaxContainerType& GetMaxs()
const
00203
{
return m_Max ; }
00204
00206 MeasurementVectorType& GetHistogramMinFromValue(
const MeasurementVectorType
00207 &measurement) ;
00208
00210 MeasurementVectorType& GetHistogramMaxFromValue(
const MeasurementVectorType
00211 &measurement) ;
00212
00214 MeasurementVectorType& GetHistogramMinFromIndex(
const IndexType &index) ;
00215
00217 MeasurementVectorType& GetHistogramMaxFromIndex(
const IndexType &index) ;
00218
00220 FrequencyType GetFrequency(
const InstanceIdentifier &
id)
const
00221
{
return m_FrequencyContainer->GetFrequency(
id) ; }
00222
00224 FrequencyType GetFrequency(
const IndexType &index)
const ;
00225
00227
void SetFrequency(
const FrequencyType value) ;
00228
00230 void SetFrequency(
const InstanceIdentifier &
id,
const FrequencyType value)
00231 { m_FrequencyContainer->SetFrequency(
id, value) ; }
00232
00234
void SetFrequency(
const IndexType &index,
00235
const FrequencyType value) ;
00236
00238
void SetFrequency(
const MeasurementVectorType &measurement,
00239
const FrequencyType value) ;
00240
00241
00244 void IncreaseFrequency(
const InstanceIdentifier &
id,
00245
const FrequencyType value)
00246 { m_FrequencyContainer->IncreaseFrequency(
id, value) ; }
00247
00250
void IncreaseFrequency(
const IndexType &index,
00251
const FrequencyType value) ;
00252
00255
void IncreaseFrequency(
const MeasurementVectorType &measurement,
00256
const FrequencyType value) ;
00257
00259
const MeasurementVectorType & GetMeasurementVector(
const InstanceIdentifier &
id)
const;
00260
00262
const MeasurementVectorType & GetMeasurementVector(
const IndexType &index)
const;
00263
00265 MeasurementType GetMeasurement(
const unsigned long n,
00266
const unsigned int dimension)
const ;
00267
00269 FrequencyType GetTotalFrequency() const ;
00270
00272 FrequencyType GetFrequency(const
unsigned long n,
00273 const
unsigned int dimension) const ;
00274
00289
double Quantile(const
unsigned int dimension, const
double &p) ;
00290
00293 class Iterator
00294 {
00295
public:
00296 Iterator(){};
00297
00298 Iterator(
Self * histogram)
00299 {
00300 m_Id = 0 ;
00301 m_Histogram = histogram;
00302 }
00303
00304 Iterator(
InstanceIdentifier id,
Self * histogram)
00305 : m_Id(id), m_Histogram(histogram)
00306 {}
00307
00308
FrequencyType GetFrequency()
const
00309 {
00310
return m_Histogram->GetFrequency(m_Id) ;
00311 }
00312
00313
void SetFrequency(
const FrequencyType value)
00314 {
00315 m_Histogram->SetFrequency(m_Id, value);
00316 }
00317
00318
InstanceIdentifier GetInstanceIdentifier()
const
00319 {
return m_Id ; }
00320
00321
const MeasurementVectorType & GetMeasurementVector()
const
00322 {
00323
return m_Histogram->GetMeasurementVector(m_Id) ;
00324 }
00325
00326 Iterator& operator++()
00327 {
00328 ++m_Id;
00329
return *
this;
00330 }
00331
00332
bool operator!=(
const Iterator& it)
00333 {
return (m_Id != it.
m_Id); }
00334
00335
bool operator==(
const Iterator& it)
00336 {
return (m_Id == it.
m_Id); }
00337
00338 Iterator& operator=(
const Iterator& it)
00339 {
00340 m_Id = it.
m_Id;
00341 m_Histogram = it.
m_Histogram ;
00342
return *
this ;
00343 }
00344
00345 Iterator(
const Iterator& it)
00346 {
00347 m_Id = it.
m_Id;
00348 m_Histogram = it.
m_Histogram ;
00349 }
00350
00351
private:
00352
00353
InstanceIdentifier m_Id;
00354
00355
00356
Self* m_Histogram ;
00357 } ;
00358
00359
00360
class ConstIterator
00361 {
00362
public:
00363
ConstIterator(){};
00364
00365
ConstIterator(
const Self * histogram)
00366 {
00367 m_Id = 0 ;
00368 m_Histogram = histogram;
00369 }
00370
00371
ConstIterator(
InstanceIdentifier id,
const Self * histogram)
00372 : m_Id(id), m_Histogram(histogram)
00373 {}
00374
00375
FrequencyType GetFrequency()
const
00376 {
00377
return m_Histogram->GetFrequency(m_Id) ;
00378 }
00379
00380
void SetFrequency(
const FrequencyType value)
00381 {
00382 m_Histogram->SetFrequency(m_Id, value);
00383 }
00384
00385
InstanceIdentifier GetInstanceIdentifier()
const
00386 {
return m_Id ; }
00387
00388
const MeasurementVectorType & GetMeasurementVector()
const
00389 {
00390
return m_Histogram->GetMeasurementVector(m_Id) ;
00391 }
00392
00393
ConstIterator& operator++()
00394 {
00395 ++m_Id;
00396
return *
this;
00397 }
00398
00399
bool operator!=(
const ConstIterator& it)
00400 {
return (m_Id != it.
m_Id); }
00401
00402
bool operator==(
const ConstIterator& it)
00403 {
return (m_Id == it.
m_Id); }
00404
00405
ConstIterator& operator=(
const ConstIterator& it)
00406 {
00407 m_Id = it.
m_Id;
00408 m_Histogram = it.
m_Histogram ;
00409
return *
this ;
00410 }
00411
00412
ConstIterator(
const ConstIterator & it)
00413 {
00414 m_Id = it.
m_Id;
00415 m_Histogram = it.
m_Histogram ;
00416 }
00417
00418
private:
00419
00420
InstanceIdentifier m_Id;
00421
00422
00423
const Self* m_Histogram ;
00424 } ;
00425
00426 Iterator Begin()
00427 {
00428 Iterator iter(0,
this) ;
00429
return iter ;
00430 }
00431
00432 Iterator End()
00433 {
00434
return Iterator(m_OffsetTable[VMeasurementVectorSize],
this) ;
00435 }
00436
00437 ConstIterator Begin()
const
00438 {
00439 ConstIterator iter(0,
this) ;
00440
return iter ;
00441 }
00442
00443 ConstIterator End()
const
00444 {
00445
return ConstIterator(m_OffsetTable[VMeasurementVectorSize],
this) ;
00446 }
00447
00448
00449
protected:
00450 Histogram() ;
00451
virtual ~Histogram() {}
00452 void PrintSelf(std::ostream& os,
Indent indent)
const;
00453
00454
00455
SizeType m_Size ;
00456
00457
00458 std::vector< std::vector<MeasurementType> > m_Min ;
00459
00460
00461 std::vector< std::vector<MeasurementType> > m_Max ;
00462
00463
private:
00464 Histogram(
const Self&);
00465
void operator=(
const Self&);
00466
00467
InstanceIdentifier m_OffsetTable[VMeasurementVectorSize + 1] ;
00468
FrequencyContainerPointer m_FrequencyContainer ;
00469
unsigned int m_NumberOfInstances ;
00470
00471
mutable MeasurementVectorType m_TempMeasurementVector ;
00472
mutable IndexType m_TempIndex ;
00473
00474 } ;
00475
00476 }
00477 }
00478
00479
#ifndef ITK_MANUAL_INSTANTIATION
00480
#include "itkHistogram.txx"
00481
#endif
00482
00483
#endif