Main Page   Class Overview   Pixels   Images   Geometry   Quick Index  

HxHistogram.h

00001 /*
00002  *  Copyright (c) 1997, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *
00006  *  Author(s):
00007  *  Dennis Koelma (koelma@wins.uva.nl)
00008  *  Edo Poll (poll@wins.uva.nl)
00009  *  Jeroen Vendrig (vendrig@science.uva.nl)
00010  *  Leon Todoran (todoran@science.uva.nl)
00011  *  Jan Baan (baan@science.uva.nl)
00012  *  Jan-Mark Geusebroek (mark@science.uva.nl)
00013  */
00014  
00015  /*
00016   *  JV 12Feb01, added Jan Baan's chiSquareNorm (bug of unofficial 20Jul00 version corrected).  
00017   *  JV 12Feb01, added write() for histogram output
00018   */
00019 
00020 /*
00021  *  JV 12Feb01 (again 27Jun01), added Jan Baan's chiSquareNorm (bug of unofficial 20Jul00 version corrected).
00022  *  JV 12Feb01 (again 27Jun01), added ascii write() for histogram output
00023  *  JV/JM 27Jun01, added threshold, countBins
00024  *  JV/JM 27Jun01, added reduceRange, reduceRangeVal
00025  *  JV 27Jun01, added to1D
00026  *  JV 27Jun01, added valueToBin
00027  *  JV 27Jun01, added setBin for doubles
00028  *  JMG         added smooth
00029  *  JMG         changed smooth and normalize to return HxHistogram
00030  *  JMG         added nrOfBins
00031  *  JMG         changed "put" into behaviour of ascii "write"
00032  *  JMG/JV      removed ascii write
00033  */
00034 
00035 #ifndef HxHistogram_h
00036 #define HxHistogram_h
00037 
00038 #include <list>
00039 #include "HxRcPtr.h"
00040 #include "HxString.h"
00041 #include "HxPointInt.h"
00042 #include "HxScalarInt.h"
00043 #include "HxScalarDouble.h"
00044 #include "HxVec2Int.h"
00045 #include "HxVec2Double.h"
00046 #include "HxVec3Int.h"
00047 #include "HxVec3Double.h"
00048 #include "HxHistogramData.h"
00049 #include "HxIo.h"
00050 
00060 class HxHistogram {
00061 public:
00062 
00064 
00067                         HxHistogram();
00068 
00070                         HxHistogram(const HxHistogram&);
00071 
00075                         HxHistogram(int dimSize);
00076 
00080                         HxHistogram(int dimSize1, int dimSize2);
00081 
00085                         HxHistogram(int dimSize1, int dimSize2, int dimSize3);
00086 
00091                         HxHistogram(HxValueType dataType, int dimensions,
00092                             int dimSize1, int dimSize2 = 0, int dimSize3 = 0);
00093 
00097                         HxHistogram(HxValueType dataType, int dimensions,
00098                             double lowBin1, double highBin1, int nBins1,
00099                             double lowBin2, double highBin2, int nBins2,
00100                             double lowBin3, double highBin3, int nBins3);
00101 
00103                         HxHistogram(HxString filename);
00104 
00105 
00107 
00109 
00111                         ~HxHistogram();
00113 
00115 
00117     HxHistogram&        operator=(const HxHistogram&);
00118 
00120     int                 isNull() const;
00121 
00123                         operator int() const;
00125 
00127 
00129     int                 ident() const;
00130 
00134     HxValueType         dataType() const;
00135 
00137     int                 dimensionality() const;
00138 
00142     int                 dimensionSize(int dim) const;
00143 
00146     int                 nrOfBins() const;
00147 
00149     double              lowBin(int dim) const;
00150 
00152     double              highBin(int dim) const;
00153 
00155     double              binWidth(int dim) const;
00156 
00158     double              binToValue(int bin, int dimension) const;
00159 
00161     int                 valueToBin(double value, int dimension) const;  
00162 
00164     double              get(int bin1) const;
00165 
00167     double              get(int bin1, int bin2) const;
00168 
00170     double              get(int bin1, int bin2, int bin3) const;
00172 
00174 
00176     void                insertValChecked(int val);
00177 
00179     void                insertValChecked(double val);
00180 
00182     void                insertValChecked(HxScalarInt val);
00183 
00185     void                insertValChecked(HxScalarDouble val);
00186 
00188     void                insertValChecked(HxVec2Int val);
00189 
00191     void                insertValChecked(HxVec2Double val);
00192 
00194     void                insertValChecked(HxVec3Int val);
00195 
00197     void                insertValChecked(HxVec3Double val);
00198 
00203     void                incBinChecked(int bin);
00204 
00209     void                incBinChecked(int bin1, int bin2);
00210 
00215     void                incBinChecked(int bin1, int bin2, int bin3);
00217 
00219 
00222     void                insertVal(int val);
00223 
00225     void                insertVal(double val);
00226 
00228     void                insertVal(double val, double sigma);
00229 
00231     void                insertVal(HxScalarInt val);
00232 
00234     void                insertVal(HxScalarDouble val);
00235 
00237     void                insertVal(HxVec2Int val);
00238 
00240     void                insertVal(HxVec2Double val);
00241 
00243     void                insertVal(HxVec3Int val);
00244 
00246     void                insertVal(HxVec3Double val);
00247 
00248 
00252     void                incBin(int bin); //inline
00253 
00257     void                incBin(int bin1, int bin2); //inline
00258 
00262     void                incBin(int bin1, int bin2, int bin3); //inline
00263 
00267     void                setBin(int bin1, long val);
00268 
00272     void                setBin(int bin1, int bin2, long val);
00273 
00277     void                setBin(int bin1, int bin2, int bin3, long val);
00278 
00282     void                setBin(int bin1, double val);
00283 
00287     void                setBin(int bin1, int bin2, double val);
00288 
00292     void                setBin(int bin1, int bin2, int bin3, double val);
00293 
00295 
00297 
00299     HxHistogram         smooth(double sigma = 3.0);
00300 
00302     std::list<HxVec2Double> modes();
00303 
00305     HxHistogram         normalize(double weight = 1.0);
00306 
00308     double              sum() const;
00309 
00311     double              minVal() const;
00312 
00316     double              minVal(int *index) const;
00317 
00319     double              maxVal() const;
00320 
00324     double              maxVal(int *index) const;
00325 
00327     double              intersection(const HxHistogram&) const;
00328 
00330     double              chiSquare(const HxHistogram&) const;
00331 
00333     double              chiSquareNorm(const HxHistogram&) const;
00334 
00336 
00338 
00340     HxHistogram         convert(HxValueType dataType);
00341 
00345     void                getDataDouble(double* data);
00346 
00350     void                getDataInt(int* data);
00351 
00356     void                render3d(int* data, int dataWidth, int dataHeight,
00357                             double elevation, double alpha, double threshold);
00358 
00360     STD_OSTREAM&        put(STD_OSTREAM&, HxString delimit = " ") const;
00361 
00363     int                 write(HxString filename);
00364 
00366 
00368 
00373     HxHistogram         threshold(double valThreshold);
00374     
00378     int                 countBins(double valThreshold=0.0);
00379 
00384     HxHistogram         reduceRange(int binMin1, int binMax1=-1,
00385                                     int binMin2=0, int binMax2=-1,
00386                                     int binMin3=0, int binMax3=-1);
00387 
00394     HxHistogram         reduceRangeVal(double binValMin1, double binValMax1,
00395                                      double binValMin2=0, double binValMax2=0,
00396                                      double binValMin3=0, double binValMax3=0);
00397 
00401     HxHistogram         to1D(int dim=1);
00402 
00404 private:
00405 
00406                         HxHistogram(const HxHistogramData*);
00407 
00408     int                 isEqualSize(const HxHistogram&) const;
00409 
00410     HxRcPtr<HxHistogramData>    _data;
00411 
00412 };
00413 
00414 inline STD_OSTREAM&
00415 operator<<(STD_OSTREAM& os, const HxHistogram& his)
00416 { 
00417     return his.put(os);
00418 }
00419 
00420 inline HxString
00421 makeString(const HxHistogram& his)
00422 {
00423     return HxString("HxHistogram") + makeString(his.ident());
00424 }
00425 
00426 inline double
00427 HxHistogram::get(int bin1) const
00428 {
00429     return _data ? _data->getBin(bin1) : 0;
00430 }
00431 
00432 inline double
00433 HxHistogram::get(int bin1, int bin2) const
00434 {
00435     return _data ? _data->getBin(bin2 * _data->_dimSize1 + bin1) : 0;
00436 }
00437 
00438 inline double
00439 HxHistogram::get(int bin1, int bin2, int bin3) const
00440 {
00441     return _data ? _data->getBin((bin3 * _data->_dimSize2 + bin2) *
00442                                 _data->_dimSize1 + bin1) : 0;
00443 }
00444 
00445 inline void
00446 HxHistogram::incBin(int bin)
00447 {
00448     if ((bin >= 0) && (bin < _data->_dimSize1))
00449         _data->incBin(bin);
00450 }
00451 
00452 inline void
00453 HxHistogram::incBin(int bin1, int bin2)
00454 {
00455     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00456             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00457         _data->incBin(bin2 * _data->_dimSize1 + bin1);
00458 }
00459 
00460 inline void
00461 HxHistogram::incBin(int bin1, int bin2, int bin3)
00462 {
00463     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00464             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00465             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00466         _data->incBin((bin3 * _data->_dimSize2 + bin2) *
00467                      _data->_dimSize1 + bin1);
00468 }
00469 
00470 inline void
00471 HxHistogram::setBin(int bin1, long val)
00472 {
00473     if ((bin1 >= 0) && (bin1 < _data->_dimSize1))           
00474         _data->setBin(bin1, val);
00475 }
00476 
00477 inline void
00478 HxHistogram::setBin(int bin1, int bin2, long val)
00479 {
00480     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00481             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00482         _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00483 }
00484 
00485 inline void
00486 HxHistogram::setBin(int bin1, int bin2, int bin3, long val)
00487 {
00488     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00489             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00490             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00491         _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00492                      _data->_dimSize1 + bin1, val);
00493 }
00494 
00495 inline void
00496 HxHistogram::setBin(int bin1, double val)
00497 {
00498     if ((bin1 >= 0) && (bin1 < _data->_dimSize1))           
00499         _data->setBin(bin1, val);
00500 }
00501 
00502 inline void
00503 HxHistogram::setBin(int bin1, int bin2, double val)
00504 {
00505     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00506             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00507         _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00508 }
00509 
00510 inline void
00511 HxHistogram::setBin(int bin1, int bin2, int bin3, double val)
00512 {
00513     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00514             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00515             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00516         _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00517                      _data->_dimSize1 + bin1, val);
00518 }
00519 
00520 inline void
00521 HxHistogram::insertVal(int val)
00522 {
00523     incBin((int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00524 }
00525 
00526 inline void
00527 HxHistogram::insertVal(double val)
00528 {
00529     incBin((int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00530 }
00531 
00532 inline void
00533 HxHistogram::insertVal(HxScalarInt val)
00534 {
00535     incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00536 }
00537 
00538 inline void
00539 HxHistogram::insertVal(HxScalarDouble val)
00540 {
00541     incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00542 }
00543 
00544 inline void
00545 HxHistogram::insertVal(HxVec2Int val)
00546 {
00547     incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00548            (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5));
00549 }
00550 
00551 inline void
00552 HxHistogram::insertVal(HxVec2Double val)
00553 {
00554     incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00555            (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5));
00556 }
00557 
00558 inline void
00559 HxHistogram::insertVal(HxVec3Int val)
00560 {
00561     incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00562            (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5),
00563            (int) (((val.z() - _data->_lowBin3) / _data->_binWidth3) + 0.5));
00564 }
00565 
00566 inline void
00567 HxHistogram::insertVal(HxVec3Double val)
00568 {
00569     incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00570            (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5),
00571            (int) (((val.z() - _data->_lowBin3) / _data->_binWidth3) + 0.5));
00572 }
00573 
00574 #endif

Generated on Tue Jan 8 13:59:12 2002 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001