00001
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
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
00112
00113 MAKE_ASSISTANT(
00114 Equalize,
00115 SourceAccessorEqualizeOf,
00116 {}
00117 );
00118
00119
00120
00121
00122 MAKE_TYPECHANGE_ASSISTANT(
00123 GreyPixelEqualize,
00124 SourceAccessorEqualizeOf,
00125 Pixel8BitGrey,
00126 TypeOfDimensionality(SOURCE),
00127 TypeOfPrecision(SOURCE),
00128 {}
00129 );
00130
00131 #endif // __SOURCEACCESSOREQUALIZE_H__