Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Histogram1D.cpp
1 #include "Histogram1D.hh"
2 
3 using namespace BIAS;
4 using namespace std;
5 
6 template <class T>
9  : Debug(), Data_(), NumBins_(100), MinValue_(T(0)), MaxValue_(T(0)),
10  BinSize_(T(0)), AutoScale_(true)
11 {}
12 
13 template <class T>
16 {}
17 
18 
19 template <class T>
21 AddData(const std::vector<T>& data)
22 { Data_.insert(Data_.end(), data.begin(), data.end()); }
23 
24 template <class T>
26 AddData(const T& data)
27 { Data_.push_back(data); }
28 
29 template <class T>
31 GetHistogram(std::vector<T>& bin_center, std::vector<unsigned>& hist)
32 {
33  if (AutoScale_)
34  InitInternalsFromData_();
35  else
36  InitInternals_();
37 
38  ComputeBinCenters_(bin_center);
39 
40  hist.resize(NumBins_, 0u);
41 
42  int num = 0;
43  register int bin;
44  typename std::vector<T>::const_iterator it;
45  for (it=Data_.begin(); it!=Data_.end(); it++){
46  if (*it<MinValue_ || *it>MaxValue_){
47  /// this should not happen when autoscale is true
48  BIASASSERT(!AutoScale_);
49  continue;
50  }
51  bin = GetBinNum_(*it);
52  // BIASASSERT(bin>=0 && bin<(int)NumBins_);
53  if(bin>=0 && bin<(int)NumBins_){
54  hist[bin]++;
55  num++;
56  }
57  }
58 
59  return num;
60 }
61 
62 template <class T>
65 {
66  vector<T> center;
67  vector<unsigned> histo;
68  GetHistogram(center,histo);
69  T maxValue=(T)0.0f; unsigned maxHist=0;
70  for(unsigned i=0;i<histo.size();i++){
71  if(histo[i] > maxHist){
72  maxValue=center[i];
73  maxHist =histo[i];
74  }
75  }
76  return maxValue;
77 }
78 
79 template <class T>
82 {
83  BIASASSERT(AutoScale_);
84  if (Data_.empty()) {
85  BIASERR("cannot init, no data");
86  return;
87  }
88  MinValue_ = MaxValue_ = Data_[0];
89  if (Data_.size()<=1){
90  BIASERR("cannot init, not enough data");
91  return;
92  }
93 
94  typename std::vector<T>::const_iterator it;
95  for (it=Data_.begin(); it!=Data_.end(); it++){
96  if (*it < MinValue_) MinValue_ = *it;
97  if (*it > MaxValue_) MaxValue_ = *it;
98  }
99  InitInternals_();
100 }
101 
102 
103 template <class T>
104 void Histogram1D<T>::
106 {
107  if (MaxValue_<=MinValue_){
108  BIASERR("max value <= min value, histogram computation impossible");
109  BinSize_ = (T)0.;
110  return;
111  }
112  BIASASSERT(NumBins_>0);
113  BinSize_ = (T)(((double)MaxValue_ - (double)MinValue_) / (double)NumBins_);
114 }
115 
116 
117 template <class T>
118 void Histogram1D<T>::
119 ComputeBinCenters_(std::vector<T>& center) const
120 {
121  BIASASSERT(BinSize_>(T)0.);
122  center.resize(NumBins_);
123  double half_bin_size = (double)BinSize_ * 0.5;
124  for (unsigned i=0; i<NumBins_; i++)
125  center[i] = (T)((double)i * (double)BinSize_ + half_bin_size + (double)MinValue_);
126 }
127 
128 #define INSTANCE_Hist1D(type)\
129 template class BIASMathAlgo_EXPORT Histogram1D<type>;
130 
131 // create instances
132 namespace BIAS{
133 INSTANCE_Hist1D(float)
134 INSTANCE_Hist1D(double)
135 INSTANCE_Hist1D(int)
136 }
int GetHistogram(std::vector< T > &bin_center, std::vector< unsigned > &hist)
Definition: Histogram1D.cpp:31
void AddData(const std::vector< T > &data)
Definition: Histogram1D.cpp:21
T GetBinCenterWithMaxEntries()
Definition: Histogram1D.cpp:64
void ComputeBinCenters_(std::vector< T > &center) const
void InitInternalsFromData_()
Definition: Histogram1D.cpp:81