Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __cmtkLogHistogram_h_included_
00034 #define __cmtkLogHistogram_h_included_
00035
00036 #include <cmtkconfig.h>
00037
00038 #include <Base/cmtkHistogram.h>
00039 #include <System/cmtkSmartPtr.h>
00040 #include <math.h>
00041
00042 namespace
00043 cmtk
00044 {
00045
00048
00051 template<class T>
00052 class LogHistogram :
00054 public Histogram<T>
00055 {
00056 public:
00058 typedef LogHistogram<T> Self;
00059
00061 typedef SmartPointer<Self> SmartPtr;
00062
00064 typedef Histogram<T> Superclass;
00065
00068 LogHistogram ( const size_t numBins = 0 ) : Superclass( numBins ), m_LogNumBins( log( static_cast<double>( numBins ) ) ) {}
00069
00074 virtual ~LogHistogram() {}
00075
00077 virtual void Resize( const size_t numberOfBins, const bool reset = true )
00078 {
00079 this->Superclass::Resize( numberOfBins, reset );
00080 this->m_LogNumBins = log( static_cast<double>( numberOfBins ) );
00081 }
00082
00084 typename Self::SmartPtr Clone () const
00085 {
00086 return typename Self::SmartPtr( this->CloneVirtual() );
00087 }
00088
00093 virtual size_t ValueToBin ( const Types::DataItem value ) const
00094 {
00095 return static_cast<size_t>( this->ValueToBinFractional( value ) );
00096 }
00097
00104 virtual Types::DataItem ValueToBinFractional ( const Types::DataItem value ) const
00105 {
00106 const Types::DataItem binIndex = this->Superclass::ValueToBinFractional( value );
00107 return (this->GetNumBins()-1) * std::max<Types::DataItem>( 0.0, std::min<Types::DataItem>( 1.0, log( 1+binIndex ) / this->m_LogNumBins ) );
00108 }
00109
00112 virtual const Types::DataItemRange GetRangeBin( const size_t bin ) const
00113 {
00114 return Types::DataItemRange( this->BinToValue( bin ), this->BinToValue( bin+1 ) );
00115 }
00116
00121 virtual Types::DataItem BinToValue ( const size_t bin ) const
00122 {
00123 return this->Superclass::BinToValue( static_cast<size_t>( exp( static_cast<Types::DataItem>( bin ) / (this->GetNumBins()-1) * this->m_LogNumBins ) - 1 ) );
00124 }
00125
00126 protected:
00128 virtual Self* CloneVirtual() const
00129 {
00130 return new Self( *this );
00131 }
00132
00133 private:
00135 double m_LogNumBins;
00136 };
00137
00139
00140 }
00141
00142 #endif // #ifndef __cmtkLogHistogram_h_included_