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