/vol/vipdata/irtk/image++/include/irtkHistogram_2D.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
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