SourceAccessorEqualize.h

Go to the documentation of this file.
00001 // $Id$
00002 
00003 #ifndef __SOURCEACCESSOREQUALIZE_H__
00004 #define __SOURCEACCESSOREQUALIZE_H__
00005 
00006 #include "SourceGenerics.h"
00007 
00008 #include <math.h>
00009 
00010 template<class DATA, int DIMENSIONALITY, class PRECISION, class SOURCE>
00011 class SourceAccessorEqualizeBaseOf: public SourceAccessorOf<DATA,
00012     DIMENSIONALITY, PRECISION, SOURCE>
00013 {
00014 protected:
00015   mutable DATA m_vdataRemap[Range(TypeOfData(SOURCE))];
00016 
00017 public:
00018   typedef PointOf<DIMENSIONALITY, PRECISION> type_point;
00019   typedef DATA type_data;
00020   typedef PRECISION type_precision;
00021   static const int type_dimensionality = DIMENSIONALITY;
00022 
00023   virtual String Describe() const
00024   {
00025     return (_LINE + "SourceAccessorEqualizeOf(" + DIMENSIONALITY + ")" + LINE_
00026         + this->DescribeCommon());
00027   }
00028 
00029   void PrepareForAccessAction() const
00030   {
00031     this->m_ptSize = this->m_psource->Size();
00032     const int c = Range(TypeOfData(SOURCE));
00033     int vcdata[c];
00034 
00035     for (int n = 0; n < c; n++)
00036       {
00037       vcdata[n] = 0;
00038       }
00039 
00040     forpoint(type_point,pt,0,this->Size())
00041       {
00042       TypeOfData(SOURCE) data;
00043       ::GetPoint(*(this->m_psource),data,pt);
00044       vcdata[data]++;
00045       }
00046 
00047     // make CDF
00048     for (int n = 1; n < c; n++)
00049       {
00050       vcdata[n] = vcdata[n - 1];
00051       }
00052 
00053     int cdataPerBin = this->CSize() / Range(DATA);
00054 
00055     for (int n = 0; n < c; n++)
00056       {
00057       m_vdataRemap[n] = (vcdata[n] + (n > 0 ? vcdata[n - 1] : 0)) / 2
00058           / cdataPerBin;
00059       }
00060   }
00061 };
00062 
00063 template<class DATA, int DIMENSIONALITY, class PRECISION, class SOURCE>
00064 class SourceAccessorEqualizeOf: public SourceAccessorEqualizeBaseOf<DATA,
00065     DIMENSIONALITY, PRECISION, SOURCE>
00066 {
00067 };
00068 
00069 template<class DATA, class PRECISION, class SOURCE>
00070 class SourceAccessorEqualizeOf<DATA, 2, PRECISION, SOURCE> : public SourceAccessorEqualizeBaseOf<
00071     DATA, 2, PRECISION, SOURCE>
00072 {
00073 public:
00074 SOURCE_ACTUALS_2D  ;
00075 
00076   void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY) const
00077     {
00078     DATA dataT;
00079     ::Get(*(this->m_psource),dataT,rX,rY);
00080     dataOut=this->m_vdataRemap[dataT];
00081     }
00082 
00083   void Set(const PRECISION &rX, const PRECISION &rY, const DATA& data)
00084     {
00085     ERROR("Not implemented");
00086     }
00087   };
00088 
00089 template<class DATA, class PRECISION, class SOURCE>
00090 class SourceAccessorEqualizeOf<DATA, 3, PRECISION, SOURCE> : public SourceAccessorEqualizeBaseOf<
00091     DATA, 3, PRECISION, SOURCE>
00092 {
00093 public:
00094 SOURCE_ACTUALS_3D  ;
00095 
00096   void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ) const
00097     {
00098     TypeOfData(SOURCE) dataT;
00099     ::Get(*(this->m_psource),dataT,rX,rY,rZ);
00100     dataOut=this->m_vdataRemap[dataT];
00101     }
00102 
00103   void Set(const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ,const DATA& data)
00104     {
00105     ERROR("Not implemented");
00106     }
00107 
00108   };
00109 
00110 //============================================================================
00111 // assistant
00112 //============================================================================
00113 MAKE_ASSISTANT(
00114     Equalize,
00115     SourceAccessorEqualizeOf,
00116       {}
00117 );
00118 
00119 //============================================================================
00120 // assistant
00121 //============================================================================
00122 MAKE_TYPECHANGE_ASSISTANT(
00123     GreyPixelEqualize,
00124     SourceAccessorEqualizeOf,
00125     Pixel8BitGrey,
00126     TypeOfDimensionality(SOURCE),
00127     TypeOfPrecision(SOURCE),
00128       {}
00129 );
00130 
00131 #endif // __SOURCEACCESSOREQUALIZE_H__

Generated on 6 Apr 2011 for Slicer3 by  doxygen 1.6.1