Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
GenerateGauss.cpp
1 #include <Base/Math/GenerateGauss.hh>
2 
3 #include <Base/Math/Vector.hh>
4 #include <Base/Math/Vector.hh>
5 
6 using namespace BIAS;
7 using namespace std;
8 
9 template <class T>
10 void GenerateGauss::
11 Gauss1DSigma(const double &sigma, const double &ratio, BIAS::Vector<T> &result,
12  const bool normalize)
13 {
14  unsigned size;
15  Sigma2Size_(sigma, ratio, size);
16  Gauss1D(size, sigma, result, normalize);
17 }
18 
19 
20 template <class T>
21 void GenerateGauss::
22 Gauss1DSize(const unsigned size, const double &ratio, BIAS::Vector<T> &result,
23  double &sigma, const bool normalize)
24 {
25  Size2Sigma_(size, ratio, sigma);
26  Gauss1D(size, sigma, result, normalize);
27 }
28 
29 
30 template <class T>
31 void GenerateGauss::
32 Gauss1D(const unsigned size, const double &sigma, BIAS::Vector<T> &result,
33  const bool normalize)
34 {
35  result.newsize(size);
36  const double fac = 1.0/(2.0*sigma*sigma);
37  // n = 1/sqrt(2+M_PI)/sigma
38  const double n = 0.39894228040143267794 / sigma;
39  T sum = (T)0;
40  int hws = size/2;
41  if (size%2==0){
42  for (int i=0; i<hws; i++){
43  result[hws+i] = result[hws-i-1] =
44  (T)(n*exp(-((double)(i)+0.5)*((double)(i)+0.5)*fac));
45  if (normalize)
46  sum += ((T)2.0)*result[hws+i];
47  }
48  } else {
49  for (int i=0; i<=hws; i++){
50  result[hws+i] = result[hws-i] =
51  (T)(n*exp(-(double)(i)*(double)(i)*fac));
52  if (normalize)
53  sum += ((T)2.0)*result[hws-i];
54  }
55  if (normalize)
56  sum -= result[hws]; // added twice
57  }
58 
59  if (normalize){
60  // normalize filter, so that the sum is 1.0
61  result /= sum;
62  }
63 }
64 
65 
66 template <class T>
67 void GenerateGauss::
68 Gauss2DSigma(const double &sigma, const double &ratio,
69  BIAS::Matrix<T> &result,const bool normalize)
70 {
71  unsigned size;
72  Sigma2Size_(sigma, sqrt(ratio), size);
73  Gauss2D(size, sigma, result, normalize);
74 }
75 
76 
77 template <class T>
78 void GenerateGauss::
79 Gauss2DSize(const unsigned size, const double &ratio,
80  BIAS::Matrix<T> &result, double &sigma, const bool normalize)
81 {
82  Size2Sigma_(size, sqrt(ratio), sigma);
83  Gauss2D(size, sigma, result, normalize);
84 }
85 
86 
87 template <class T>
88 void GenerateGauss::
89 Gauss2D(const unsigned size, const double &sigma,
90  BIAS::Matrix<T> &result, const bool normalize)
91 {
92  Vector<T> vg;
93  Gauss1D(size, sigma, vg, false);
94  result = vg.OuterProduct(vg);
95  if (normalize){
96  const int num = size*size;
97  const T *data = result.GetData();
98  double sum = 0.0;
99  for (int i=0; i<num; i++)
100  sum += (double)(data[i]);
101  result /= (T)sum;
102  }
103 }
104 
105 
106 //////////////////////////////////////////////////////////////////////////
107 // instantiation
108 
109 #define INST(type)\
110  template BIASMathBase_EXPORT void GenerateGauss::Gauss1DSigma(const double &sigma, const double &ratio, BIAS::Vector<type> &result,const bool normalize);\
111  template BIASMathBase_EXPORT void GenerateGauss::Gauss1DSize(const unsigned size, const double &ratio, BIAS::Vector<type> &result, double &sigma, const bool normalize); \
112  template BIASMathBase_EXPORT void GenerateGauss::Gauss1D(const unsigned size, const double &sigma, BIAS::Vector<type> &result, const bool normalize);\
113  template BIASMathBase_EXPORT void GenerateGauss::Gauss2DSigma(const double &sigma, const double &ratio, BIAS::Matrix<type> &result,const bool normalize);\
114  template BIASMathBase_EXPORT void GenerateGauss::Gauss2DSize(const unsigned size, const double &ratio, BIAS::Matrix<type> &result, double &sigma, const bool normalize);\
115  template BIASMathBase_EXPORT void GenerateGauss::Gauss2D(const unsigned size, const double &sigma, BIAS::Matrix<type> &result, const bool normalize)
116 
117 
118 INST(float);
119 INST(double);
class for column vectors with arbitrary size
static void Gauss1DSigma(const double &sigma, const double &ratio, BIAS::Vector< T > &result, const bool normalize=true)
Vector< T > & newsize(Subscript N)
Definition: vec.h:220
Matrix< T > OuterProduct(const Vector< T > &v) const
outer product, constructs a matrix.
Definition: Vector.cpp:99
INST(unsigned char)
static void Gauss2DSigma(const double &sigma, const double &ratio, BIAS::Matrix< T > &result, const bool normalize=true)
static void Gauss1D(const unsigned size, const double &sigma, BIAS::Vector< T > &result, const bool normalize=true)
T * GetData()
get the pointer to the data array of the matrix (for faster direct memeory access) ...
Definition: Matrix.hh:185
static void Gauss2DSize(const unsigned size, const double &ratio, BIAS::Matrix< T > &result, double &sigma, const bool normalize=true)
static void Gauss2D(const unsigned size, const double &sigma, BIAS::Matrix< T > &result, const bool normalize=true)
matrix class with arbitrary size, indexing is row major.
static void Gauss1DSize(const unsigned size, const double &ratio, BIAS::Vector< T > &result, double &sigma, const bool normalize=true)