Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's 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  *  Andrew D. Bagdanov (andrew@science.uva.nl)
00014  */
00015  
00016  /*
00017   *  JV 12Feb01, added Jan Baan's chiSquareNorm (bug of unofficial 20Jul00 version corrected).  
00018   *  JV 12Feb01, added write() for histogram output
00019   */
00020 
00021 /*
00022  *  JV 12Feb01 (again 27Jun01), added Jan Baan's chiSquareNorm (bug of unofficial 20Jul00 version corrected).
00023  *  JV 12Feb01 (again 27Jun01), added ascii write() for histogram output
00024  *  JV/JM 27Jun01, added threshold, countBins
00025  *  JV/JM 27Jun01, added reduceRange, reduceRangeVal
00026  *  JV 27Jun01, added to1D
00027  *  JV 27Jun01, added valueToBin
00028  *  JV 27Jun01, added setBin for doubles
00029  *  JMG         added smooth
00030  *  JMG         changed smooth and normalize to return HxHistogram
00031  *  JMG         added nrOfBins
00032  *  JMG         changed "put" into behaviour of ascii "write"
00033  *  JMG/JV      removed ascii write
00034  *  JMG/CdeB    changed limits to exactly match the interval
00035  *  JMG/CdB/ADB changed binToValue, valueToBin
00036  *  JMG/CdB     changed insertValue etc.
00037  *  LT 04Sep02  added Isodata and Entropy methods for computing threshold value
00038  */
00039 
00040 #ifndef HxHistogram_h
00041 #define HxHistogram_h
00042 
00043 #include <list>
00044 #include "HxRcPtr.h"
00045 #include "HxString.h"
00046 #include "HxPointInt.h"
00047 #include "HxScalarInt.h"
00048 #include "HxScalarDouble.h"
00049 #include "HxVec2Int.h"
00050 #include "HxVec2Double.h"
00051 #include "HxVec3Int.h"
00052 #include "HxVec3Double.h"
00053 #include "HxHistogramData.h"
00054 #include "HxIo.h"
00055 
00067 class HxHistogram {
00068 public:
00069 
00071 
00074                         HxHistogram();
00075 
00077                         HxHistogram(const HxHistogram&);
00078 
00082                         HxHistogram(int dimSize);
00083 
00087                         HxHistogram(int dimSize1, int dimSize2);
00088 
00092                         HxHistogram(int dimSize1, int dimSize2, int dimSize3);
00093 
00098                         HxHistogram(HxValueType dataType, int dimensions,
00099                             int dimSize1, int dimSize2 = 0, int dimSize3 = 0);
00100 
00104                         HxHistogram(HxValueType dataType, int dimensions,
00105                             double lowBin1, double highBin1, int nBins1,
00106                             double lowBin2, double highBin2, int nBins2,
00107                             double lowBin3, double highBin3, int nBins3);
00108 
00110                         HxHistogram(HxString filename);
00111 
00112 
00114 
00116 
00118                         ~HxHistogram();
00120 
00122 
00124     HxHistogram&        operator=(const HxHistogram&);
00125 
00127     int                 isNull() const;
00128 
00130                         operator int() const;
00132 
00134 
00136     int                 ident() const;
00137 
00141     HxValueType         dataType() const;
00142 
00144     int                 dimensionality() const;
00145 
00149     int                 dimensionSize(int dim) const;
00150 
00153     int                 nrOfBins() const;
00154 
00156     double              lowBin(int dim) const;
00157 
00159     double              highBin(int dim) const;
00160 
00162     double              binWidth(int dim) const;
00163 
00165     double              binToValue(int bin, int dimension) const;
00166 
00168     int                 valueToBin(double value, int dimension) const;  
00169 
00171     double              get(int bin1) const;
00172 
00174     double              get(int bin1, int bin2) const;
00175 
00177     double              get(int bin1, int bin2, int bin3) const;
00179 
00181 
00183     void                insertValChecked(int val);
00184 
00186     void                insertValChecked(double val);
00187 
00189     void                insertValChecked(HxScalarInt val);
00190 
00192     void                insertValChecked(HxScalarDouble val);
00193 
00195     void                insertValChecked(HxVec2Int val);
00196 
00198     void                insertValChecked(HxVec2Double val);
00199 
00201     void                insertValChecked(HxVec3Int val);
00202 
00204     void                insertValChecked(HxVec3Double val);
00205 
00210     void                incBinChecked(int bin);
00211 
00216     void                incBinChecked(int bin1, int bin2);
00217 
00222     void                incBinChecked(int bin1, int bin2, int bin3);
00224 
00226 
00229     void                insertVal(int val);
00230 
00232     void                insertVal(double val);
00233 
00235     void                insertVal(double val, double sigma);
00236 
00238     void                insertVal(HxScalarInt val);
00239 
00241     void                insertVal(HxScalarDouble val);
00242 
00244     void                insertVal(HxVec2Int val);
00245 
00247     void                insertVal(HxVec2Double val);
00248 
00250     void                insertVal(HxVec3Int val);
00251 
00253     void                insertVal(HxVec3Double val);
00254 
00255 
00259     void                incBin(int bin); //inline
00260 
00264     void                incBin(int bin1, int bin2); //inline
00265 
00269     void                incBin(int bin1, int bin2, int bin3); //inline
00270 
00274     void                setBin(int bin1, long val);
00275 
00279     void                setBin(int bin1, int bin2, long val);
00280 
00284     void                setBin(int bin1, int bin2, int bin3, long val);
00285 
00289     void                setBin(int bin1, double val);
00290 
00294     void                setBin(int bin1, int bin2, double val);
00295 
00299     void                setBin(int bin1, int bin2, int bin3, double val);
00300 
00302 
00304 
00306     HxHistogram         smooth(double sigma = 3.0);
00307 
00309     std::list<HxVec2Double> modes();
00310 
00312     HxHistogram         normalize(double weight = 1.0);
00313 
00315     double              sum() const;
00316 
00318     double              minVal() const;
00319 
00323     double              minVal(int *index) const;
00324 
00326     double              maxVal() const;
00327 
00331     double              maxVal(int *index) const;
00332 
00334     double              intersection(const HxHistogram&) const;
00335 
00337     double              chiSquare(const HxHistogram&) const;
00338 
00340     double              chiSquareNorm(const HxHistogram&) const;
00341 
00343 
00345 
00346     int                 computeIsodataThreshold(void);
00347     int                 computeEntropyThreshold(void);
00349 
00350 
00352 
00354     HxHistogram         convert(HxValueType dataType);
00355 
00361     void                getTheData(double *x, double* y);
00362 
00368     void                getTheData2(double *x1, double *x2, double* y);
00369 
00375     void                getTheData3(double *x1, double *x2, double *x3,
00376                                 double* y);
00377 
00381     void                getDataDouble(double* data);
00382 
00386     void                getDataInt(int* data);
00387 
00392     void                render3d(int* data, int dataWidth, int dataHeight,
00393                             double elevation, double alpha, double threshold);
00394 
00396     STD_OSTREAM&        put(STD_OSTREAM&, HxString delimit = " ") const;
00397 
00399     int                 write(HxString filename);
00400 
00402 
00404 
00409     HxHistogram         threshold(double valThreshold);
00410     
00414     int                 countBins(double valThreshold=0.0);
00415 
00420     HxHistogram         reduceRange(int binMin1, int binMax1=-1,
00421                                     int binMin2=0, int binMax2=-1,
00422                                     int binMin3=0, int binMax3=-1);
00423 
00430     HxHistogram         reduceRangeVal(double binValMin1, double binValMax1,
00431                                      double binValMin2=0, double binValMax2=0,
00432                                      double binValMin3=0, double binValMax3=0);
00433 
00437     HxHistogram         to1D(int dim=1);
00438 
00440 private:
00441 
00442                         HxHistogram(const HxHistogramData*);
00443 
00444     int                 isEqualSize(const HxHistogram&) const;
00445 
00446     HxRcPtr<HxHistogramData>    _data;
00447 
00448 };
00449 
00450 inline STD_OSTREAM&
00451 operator<<(STD_OSTREAM& os, const HxHistogram& his)
00452 { 
00453     return his.put(os);
00454 }
00455 
00456 inline HxString
00457 makeString(const HxHistogram& his)
00458 {
00459     return HxString("HxHistogram") + makeString(his.ident());
00460 }
00461 
00462 inline double
00463 HxHistogram::get(int bin1) const
00464 {
00465     return _data ? _data->getBin(bin1) : 0;
00466 }
00467 
00468 inline double
00469 HxHistogram::get(int bin1, int bin2) const
00470 {
00471     return _data ? _data->getBin(bin2 * _data->_dimSize1 + bin1) : 0;
00472 }
00473 
00474 inline double
00475 HxHistogram::get(int bin1, int bin2, int bin3) const
00476 {
00477     return _data ? _data->getBin((bin3 * _data->_dimSize2 + bin2) *
00478                                 _data->_dimSize1 + bin1) : 0;
00479 }
00480 
00481 inline void
00482 HxHistogram::incBin(int bin)
00483 {
00484     if ((bin >= 0) && (bin < _data->_dimSize1))
00485         _data->incBin(bin);
00486 }
00487 
00488 inline void
00489 HxHistogram::incBin(int bin1, int bin2)
00490 {
00491     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00492             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00493         _data->incBin(bin2 * _data->_dimSize1 + bin1);
00494 }
00495 
00496 inline void
00497 HxHistogram::incBin(int bin1, int bin2, int bin3)
00498 {
00499     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00500             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00501             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00502         _data->incBin((bin3 * _data->_dimSize2 + bin2) *
00503                      _data->_dimSize1 + bin1);
00504 }
00505 
00506 inline void
00507 HxHistogram::setBin(int bin1, long val)
00508 {
00509     if ((bin1 >= 0) && (bin1 < _data->_dimSize1))           
00510         _data->setBin(bin1, val);
00511 }
00512 
00513 inline void
00514 HxHistogram::setBin(int bin1, int bin2, long val)
00515 {
00516     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00517             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00518         _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00519 }
00520 
00521 inline void
00522 HxHistogram::setBin(int bin1, int bin2, int bin3, long val)
00523 {
00524     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00525             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00526             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00527         _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00528                      _data->_dimSize1 + bin1, val);
00529 }
00530 
00531 inline void
00532 HxHistogram::setBin(int bin1, double val)
00533 {
00534     if ((bin1 >= 0) && (bin1 < _data->_dimSize1))           
00535         _data->setBin(bin1, val);
00536 }
00537 
00538 inline void
00539 HxHistogram::setBin(int bin1, int bin2, double val)
00540 {
00541     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00542             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00543         _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00544 }
00545 
00546 inline void
00547 HxHistogram::setBin(int bin1, int bin2, int bin3, double val)
00548 {
00549     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00550             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00551             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00552         _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00553                      _data->_dimSize1 + bin1, val);
00554 }
00555 
00556 inline void
00557 HxHistogram::insertVal(int val)
00558 {
00559     incBin((int) ((val - _data->_lowRange1) * _data->_binFac1));
00560 }
00561 
00562 inline void
00563 HxHistogram::insertVal(double val)
00564 {
00565     incBin((int) ((val - _data->_lowRange1) * _data->_binFac1));
00566 }
00567 
00568 inline void
00569 HxHistogram::insertVal(HxScalarInt val)
00570 {
00571     incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1));
00572 }
00573 
00574 inline void
00575 HxHistogram::insertVal(HxScalarDouble val)
00576 {
00577     incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1));
00578 }
00579 
00580 inline void
00581 HxHistogram::insertVal(HxVec2Int val)
00582 {
00583     incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00584             (int) ((val.y() - _data->_lowRange2) * _data->_binFac2));
00585 }
00586 
00587 inline void
00588 HxHistogram::insertVal(HxVec2Double val)
00589 {
00590     incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00591             (int) ((val.y() - _data->_lowRange2) * _data->_binFac2));
00592 }
00593 
00594 inline void
00595 HxHistogram::insertVal(HxVec3Int val)
00596 {
00597     incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00598             (int) ((val.y() - _data->_lowRange2) * _data->_binFac2),
00599             (int) ((val.z() - _data->_lowRange3) * _data->_binFac3));
00600 }
00601 
00602 inline void
00603 HxHistogram::insertVal(HxVec3Double val)
00604 {
00605     incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00606             (int) ((val.y() - _data->_lowRange2) * _data->_binFac2),
00607             (int) ((val.z() - _data->_lowRange3) * _data->_binFac3));
00608 }
00609 
00610 #endif

Generated on Mon Jan 27 15:48:43 2003 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001