/vol/vipdata/irtk/image++/include/irtkHistogram_2D.h

00001 /*=========================================================================
00002 
00003   Library   : Image Registration Toolkit (IRTK)
00004   Module    : $Id: irtkHistogram_2D.h 2 2008-12-23 12:40:14Z dr $
00005   Copyright : Imperial College, Department of Computing
00006               Visual Information Processing (VIP), 2008 onwards
00007   Date      : $Date: 2008-12-23 12:40:14 +0000 (Tue, 23 Dec 2008) $
00008   Version   : $Revision: 2 $
00009   Changes   : $Author: dr $
00010 
00011 =========================================================================*/
00012 
00013 #ifndef _IRTKHISTOGRAM_2D_H
00014 
00015 #define _IRTKHISTOGRAM_2D_H
00016 
00022 class irtkHistogram_2D : public irtkObject
00023 {
00024 
00026   int _nbins_x;
00027 
00029   int _nbins_y;
00030 
00032   int _nsamp;
00033 
00035   double _min_x;
00036 
00038   double _min_y;
00039 
00041   double _max_x;
00042 
00044   double _max_y;
00045 
00047   double _width_x;
00048 
00050   double _width_y;
00051 
00053   int **_bins;
00054 
00055 public:
00056 
00058   irtkHistogram_2D(const irtkHistogram_2D &);
00059 
00061   irtkHistogram_2D(int nbins_x = 256, int nbins_y = 256);
00062 
00064   irtkHistogram_2D(double min_x, double max_x, double width_x,
00065                    double min_y, double max_y, double width_y);
00066 
00068   ~irtkHistogram_2D(void);
00069 
00071   void Reset();
00072 
00074   void Reset(const irtkHistogram_2D &);
00075 
00077   int  GetNumberOfBinsX() const;
00078 
00080   void PutNumberOfBinsX(int);
00081 
00083   int  GetNumberOfBinsY() const;
00084 
00086   void PutNumberOfBinsY(int);
00087 
00089   void GetNumberOfBins(int *, int *) const;
00090 
00092   void PutNumberOfBins(int, int);
00093 
00095   void   GetMin(double *, double *) const;
00096 
00098   void   PutMin(double, double);
00099 
00101   void   GetMax(double *, double *) const;
00102 
00104   void   PutMax(double, double);
00105 
00107   void   GetWidth(double *, double *) const;
00108 
00110   void   PutWidth(double, double);
00111 
00113   int NumberOfSamples() const;
00114 
00116   int operator()(int, int) const;
00117 
00119   void Add(int, int, int = 1);
00120 
00122   void Delete(int, int, int = 1);
00123 
00125   void AddSample(double, double);
00126 
00128   void DelSample(double, double);
00129 
00131   int  ValToBinX(double val);
00132 
00134   double BinToValX(int    bin);
00135 
00137   int  ValToBinY(double val);
00138 
00140   double BinToValY(int    bin);
00141 
00143   void HistogramX(irtkHistogram_1D &);
00144 
00146   void HistogramY(irtkHistogram_1D &);
00147 
00149   double JointProbability(int, int);
00150 
00152   double MarginalProbabilityX(int);
00153 
00155   double MarginalProbabilityY(int);
00156 
00158   double ConditionalProbabilityXY(int, int);
00159 
00161   double ConditionalProbabilityYX(int, int);
00162 
00164   double MeanX();
00165 
00167   double MeanY();
00168 
00170   double ConditionalMeanXY(int);
00171 
00173   double ConditionalMeanYX(int);
00174 
00176   double VarianceX();
00177 
00179   double VarianceY();
00180 
00182   double ConditionalVarianceXY(int);
00183 
00185   double ConditionalVarianceYX(int);
00186 
00188   double Covariance();
00189 
00191   double StandardDeviationX();
00192 
00194   double StandardDeviationY();
00195 
00197   double EntropyX();
00198 
00200   double EntropyY();
00201 
00203   double JointEntropy();
00204 
00206   double MutualInformation();
00207 
00209   double NormalizedMutualInformation();
00210 
00212   double CrossCorrelation();
00213 
00215   double CorrelationRatioXY();
00216 
00218   double CorrelationRatioYX();
00219 
00221   double SumsOfSquaredDifferences();
00222 
00224   double LabelConsistency();
00225 
00227   double Kappa();
00228 
00230   void Read (char *filename);
00231 
00233   void Write(char *filename);
00234 
00236   void Print();
00237 };
00238 
00239 inline int irtkHistogram_2D::GetNumberOfBinsX() const
00240 {
00241   return _nbins_x;
00242 }
00243 
00244 inline int irtkHistogram_2D::GetNumberOfBinsY() const
00245 {
00246   return _nbins_y;
00247 }
00248 
00249 inline int irtkHistogram_2D::NumberOfSamples() const
00250 {
00251   return _nsamp;
00252 }
00253 
00254 inline int irtkHistogram_2D::operator()(int i, int j) const
00255 {
00256 #ifndef NO_BOUNDS
00257   if ((i < 0) || (i >= _nbins_x) || (j < 0) || (j >= _nbins_y)) {
00258     cerr << "irtkHistogram_2D::operator(): No such bin" << endl;
00259     exit(1);
00260   }
00261 #endif
00262   return _bins[j][i];
00263 }
00264 
00265 inline void irtkHistogram_2D::Add(int i, int j, int n)
00266 {
00267 #ifndef NO_BOUNDS
00268   if ((i < 0) || (i >= _nbins_x) || (j < 0) || (j >= _nbins_y)) {
00269     cerr << "irtkHistogram_2D::Add: No such bin " << i << " " << j << endl;
00270     exit(1);
00271   }
00272 #endif
00273   _bins[j][i] += n;
00274   _nsamp      += n;
00275 }
00276 
00277 inline void irtkHistogram_2D::Delete(int i, int j, int n)
00278 {
00279 #ifndef NO_BOUNDS
00280   if ((i < 0) || (i >= _nbins_x) || (j < 0) || (j >= _nbins_y)) {
00281     cerr << "irtkHistogram_2D::Delete: No such bin " << i << " " << j << endl;
00282     exit(1);
00283   }
00284 #endif
00285   _bins[j][i] -= n;
00286   _nsamp      -= n;
00287 }
00288 
00289 inline int irtkHistogram_2D::ValToBinX(double val)
00290 {
00291   int index;
00292 
00293 #ifndef NO_BOUNDS
00294   if ((val < _min_x) || (val > _max_x)) {
00295     cerr << "irtkHistogram_2D::ValToBinX: Must be between " << _min_x << " and "
00296          << _max_x << endl;
00297     exit(1);
00298   }
00299 #endif
00300   index = round(_nbins_x * (val - _min_x - 0.5*_width_x) / (_max_x - _min_x));
00301   if (index < 0) index = 0;
00302   if (index > _nbins_x-1) index = _nbins_x - 1;
00303   return index;
00304 }
00305 
00306 inline int irtkHistogram_2D::ValToBinY(double val)
00307 {
00308   int index;
00309 
00310 #ifndef NO_BOUNDS
00311   if ((val < _min_y) || (val > _max_y)) {
00312     cerr << "irtkHistogram_2D::ValToBinY: Must be between " << _min_y << " and "
00313          << _max_y << endl;
00314     exit(1);
00315   }
00316 #endif
00317   index = round(_nbins_y * (val - _min_y - 0.5*_width_y) / (_max_y - _min_y));
00318   if (index < 0) index = 0;
00319   if (index > _nbins_y-1) index = _nbins_y - 1;
00320   return index;
00321 }
00322 
00323 inline double irtkHistogram_2D::BinToValX(int i)
00324 {
00325 #ifndef NO_BOUNDS
00326   if ((i < 0) || (i >= _nbins_x)) {
00327     cerr << "irtkHistogram_1D::BinToValX: Must be between 0 and " << _nbins_x << endl;
00328     exit(1);
00329   }
00330 #endif
00331   return (i*(_max_x - _min_x)/_nbins_x + _min_x) + _width_x/2.0;
00332 }
00333 
00334 inline double irtkHistogram_2D::BinToValY(int i)
00335 {
00336 #ifndef NO_BOUNDS
00337   if ((i < 0) || (i >= _nbins_y)) {
00338     cerr << "irtkHistogram_1D::BinToValY: Must be between 0 and " << _nbins_y << endl;
00339     exit(1);
00340   }
00341 #endif
00342   return (i*(_max_y - _min_y)/_nbins_y + _min_y) + _width_y/2.0;
00343 }
00344 
00345 inline double irtkHistogram_2D::JointProbability(int i, int j)
00346 {
00347 #ifndef NO_BOUNDS
00348   if ((i < 0) || (i >= _nbins_x) || (j < 0) || (j >= _nbins_y)) {
00349     cerr << "irtkHistogram_1D::JointProbability: No such bin " << i << " ";
00350     cerr << j << endl;
00351     exit(1);
00352   }
00353 #endif
00354   return _bins[j][i] / (double) _nsamp;
00355 }
00356 
00357 inline double irtkHistogram_2D::MarginalProbabilityX(int i)
00358 {
00359   int j, n;
00360 
00361 #ifndef NO_BOUNDS
00362   if ((i < 0) || (i >= _nbins_x)) {
00363     cerr << "irtkHistogram_1D::MarginalProbabilityX: No such bin " << i << endl;
00364     exit(1);
00365   }
00366 #endif
00367   n = 0;
00368   for (j = 0; j < _nbins_y; j++) {
00369     n += _bins[j][i];
00370   }
00371   return n / (double) _nsamp;
00372 }
00373 
00374 inline double irtkHistogram_2D::MarginalProbabilityY(int i)
00375 {
00376   int j, n;
00377 
00378 #ifndef NO_BOUNDS
00379   if ((i < 0) || (i >= _nbins_y)) {
00380     cerr << "irtkHistogram_1D::MarginalProbabilityY: No such bin " << i << endl;
00381     exit(1);
00382   }
00383 #endif
00384   n = 0;
00385   for (j = 0; j < _nbins_x; j++) {
00386     n += _bins[i][j];
00387   }
00388   return n / (double) _nsamp;
00389 }
00390 
00391 inline double irtkHistogram_2D::ConditionalProbabilityXY(int i, int j)
00392 {
00393   double p;
00394 
00395   p = this->MarginalProbabilityY(j);
00396   if (p > 0) {
00397     return this->JointProbability(i, j) / p;
00398   } else {
00399     return 0;
00400   }
00401 }
00402 
00403 inline double irtkHistogram_2D::ConditionalProbabilityYX(int i, int j)
00404 {
00405   double p;
00406 
00407   p = this->MarginalProbabilityX(j);
00408   if (p > 0) {
00409     return this->JointProbability(j, i) / p;
00410   } else {
00411     return 0;
00412   }
00413 }
00414 
00415 #endif