00001
00025 #ifndef __INANNA_EQUALIZER_H__
00026 #define __INANNA_EQUALIZER_H__
00027
00028 #include <magic/mobject.h>
00029 #include <magic/mmath.h>
00030 #include <magic/mmatrix.h>
00031 #include <magic/mpararr.h>
00032 #include <magic/mtextstream.h>
00033
00034
00035 extern int xmlflag;
00036
00037
00038
00040
00041
00042
00043
00044
00045
00047
00055 class Equalizer : public Object {
00056 decl_dynamic (Equalizer);
00057 public:
00058 Equalizer () {mHandleMissing=false;}
00059 Equalizer (const Equalizer& o) {mHandleMissing=o.mHandleMissing;}
00060
00071 virtual void analyze (const Vector& vec, bool additive=false) {MUST_OVERLOAD}
00072
00078 virtual void equalize (Vector& vec) const {MUST_OVERLOAD}
00079
00082 virtual void unequalize (Vector& vec) const {MUST_OVERLOAD}
00083
00088 virtual Equalizer* clone () const {MUST_OVERLOAD; return NULL;}
00089
00091 virtual TextOStream& operator>> (TextOStream&) const {MUST_OVERLOAD; return sout;}
00092
00096 virtual void handleMissing (bool enable=true) {mHandleMissing=enable;}
00097
00098 protected:
00099 bool mHandleMissing;
00100 };
00101
00102
00103
00105
00106
00107
00108
00109
00110
00112
00115 class HistogramEq : public Equalizer {
00116 decl_dynamic (HistogramEq);
00117 public:
00118 HistogramEq (int precision=100000, double floor=0.0, double ceiling=1.0);
00119 HistogramEq (const HistogramEq& orig);
00120 virtual HistogramEq* clone () const {return new HistogramEq (*this);}
00121
00122 virtual void analyze (const Vector& vec, bool additive=false);
00123 virtual void equalize (Vector& vec) const;
00124 virtual void unequalize (Vector& vec) const;
00125
00127 virtual TextOStream& operator>> (TextOStream&) const;
00128
00129 private:
00130 static int determineDomain (float x, int precision, float lowBound, float upBound);
00131 void finalize ();
00132 void analyze2 (const Vector& vec);
00133
00134 double mLowBound;
00135 double mUpBound;
00136 double mMin;
00137 double mMax;
00138 Array<Vector> mData;
00139 Vector mHistogram;
00140 };
00141
00142
00143
00145
00146
00147
00148
00149
00150
00152
00155 class GaussianEq : public Equalizer {
00156 decl_dynamic (GaussianEq);
00157 public:
00158 GaussianEq (double avg=0.0, double stddev=0.0) {mAverage=0; mStdDev=0;}
00159 GaussianEq (const GaussianEq& orig);
00160 virtual GaussianEq* clone () const {return new GaussianEq (*this);}
00161
00162 virtual void analyze (const Vector& vec, bool additive=false);
00163 virtual void equalize (Vector& vec) const;
00164 virtual void unequalize (Vector& vec) const;
00165
00166 private:
00167 double mAverage;
00168 double mStdDev;
00169 };
00170
00171
00172
00174
00175
00176
00177
00178
00179
00181
00184 class MinmaxEq : public Equalizer {
00185 decl_dynamic (MinmaxEq);
00186 public:
00187 MinmaxEq (double trgMin=0.0, double trgMax=1.0);
00188 MinmaxEq (const MinmaxEq& orig);
00189 virtual MinmaxEq* clone () const {return new MinmaxEq (*this);}
00190
00191 virtual void analyze (const Vector& vec, bool additive=false);
00192 virtual void equalize (Vector& vec) const;
00193 virtual void unequalize (Vector& vec) const;
00194
00196 virtual TextOStream& operator>> (TextOStream& out) const;
00197
00199 virtual TextIStream& operator<< (TextIStream& in);
00200
00201 private:
00202 double mTrgMin;
00203 double mTrgMax;
00204 double mDataMin;
00205 double mDataMax;
00206 };
00207
00208
00209
00211
00212
00213
00214
00215
00216
00218
00220 class MatrixEqualizer : public Equalizer {
00221 decl_dynamic (MatrixEqualizer);
00222 public:
00223
00234 MatrixEqualizer (Equalizer* prototype=NULL);
00235
00243 void analyze (const Matrix& mat, bool additive=false);
00244
00248 void equalize (Matrix& mat) const;
00249
00253 void unequalize (Matrix& mat) const;
00254
00259 const Equalizer& getPlane (int plane) const {return *mPlaneEqualizers.getp(plane);}
00260
00262 int planes () const {return mPlaneEqualizers.size();}
00263
00265 virtual TextOStream& operator>> (TextOStream& out) const;
00266
00268 virtual TextIStream& operator<< (TextIStream& in);
00269
00270 virtual void handleMissing (bool enable=true);
00271
00272 private:
00273 void bothEqualize (Matrix& mat, bool uneq) const;
00274
00276 Array<Equalizer> mPlaneEqualizers;
00277 };
00278
00280
00284 Equalizer* readEqualizer (TextIStream& in);
00285
00286 #endif
00287