Medical Imaging Interaction Toolkit  2021.10.99-9c07a326 Medical Imaging Interaction Toolkit
mitkGaussianNoiseFunctor.h
Go to the documentation of this file.
1 /*============================================================================
2
3 The Medical Imaging Interaction Toolkit (MITK)
4
5 Copyright (c) German Cancer Research Center (DKFZ)
7
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10
11 ============================================================================*/
12
13 #ifndef MITKGAUSSIANNOISEFUNCTOR_H
14 #define MITKGAUSSIANNOISEFUNCTOR_H
15
16 #include <iostream>
17 #include <cstdlib>
18
19 namespace mitk
20 {
21  template <class TInputPixel, class TOutputPixel>
23  {
24
25  public:
26  GaussianNoiseFunctor(): m_Mu(0), m_Sigma(0) {};
28
29  void SetMean(double mu)
30  {
31  this->m_Mu = mu;
32  }
33  void SetSigma(double sigma)
34  {
35  this->m_Sigma = sigma;
36  }
37
38  bool operator!=(const GaussianNoiseFunctor& other) const
39  {
40  return !(*this == other);
41  }
42
43  bool operator==(const GaussianNoiseFunctor& other) const
44  {
45  return (this->m_Mu == other.m_Mu) && (this->m_Sigma == other.m_Sigma) ;
46  }
47
48  inline TOutputPixel operator()(const TInputPixel& value) const
49  {
50  double n = noise(this->m_Mu, this->m_Sigma);
51
52  TOutputPixel result = value + n;
53
54  return result;
55  }
56
57  private:
58  double m_Mu, m_Sigma;
59
60
65  inline double noise(double mu, double sigma) const
66  {
67  double u1, u2, W, mult;
68  static double x1, x2;
69  static int i = 0;
70
71  if (i == 1)
72  {
73  i = !i;
74  return (mu + sigma * (double)x2);
75  }
76
77  do
78  {
79  u1 = -1 + (static_cast <double>(rand()) / static_cast <double>(RAND_MAX)) * 2;
80  u2 = -1 + (static_cast <double>(rand()) / static_cast <double>(RAND_MAX)) * 2;
81  W = u1 * u1 + u2 * u2;
82  }
83  while (W >= 1 || W == 0);
84
85  mult = sqrt((-2 * log(W)) / W);
86  x1 = u1 * mult;
87  x2 = u2 * mult;
88
89  i = !i;
90
91  return (mu + sigma * (double)x1);
92
93  }
94  };
95 }
96
97
98 #endif // MITKGAUSSIANNOISEFUNCTOR_H