SMIL  1.0.4
filterKuwahara.hpp
1 #ifndef __KUWAHARA_FILTER_T_HPP__
2 #define __KUWAHARA_FILTER_T_HPP__
3 
4 namespace smil
5 {
6  template <class T>
7  RES_T kuwaharaFilter(const Image<T> &imIn, const int radius,
8  Image<T> &imOut)
9  {
10  // MORPHEE_ENTER_FUNCTION("t_kuwaharaFilter");
11 
12  ASSERT_ALLOCATED(&imIn, &imOut);
13  ASSERT_SAME_SIZE(&imIn, &imOut);
14 
15  ImageFreezer freeze(imOut);
16 
17  size_t S[3];
18  imIn.getSize(S);
19 
20  // TODO: check that image is 2D
21  if (S[2] > 1) {
22  // Error : this is a 3D image
23  return RES_ERR;
24  }
25 
26  int W, H;
27  W = S[0];
28  H = S[1];
29 
30  typename ImDtTypes<T>::lineType bufferIn = imIn.getPixels();
31  typename ImDtTypes<T>::lineType bufferOut = imOut.getPixels();
32 
33  int diameter = radius * 2 + 1;
34  int size2 = (diameter + 1) / 2;
35  int offset = (diameter - 1) / 2;
36 
37  int width2 = W + offset;
38  int height2 = H + offset;
39 
40  double *mean = new double[width2 * height2];
41  double *variance = new double[width2 * height2];
42 
43  // Creation of the mean and variance map
44  double sum, sum2;
45  int n, xbase, ybase;
46  T v = 0;
47  for (int y1 = -offset; y1 < H; y1++) {
48  for (int x1 = -offset; x1 < W; x1++) {
49  sum = 0;
50  sum2 = 0;
51  n = 0;
52  for (int x2 = x1; x2 < x1 + size2; x2++)
53  if (x2 >= 0 && x2 < W)
54  for (int y2 = y1; y2 < y1 + size2; y2++)
55  if (y2 >= 0 && y2 < H) {
56  v = bufferIn[x2 + y2 * W];
57  sum += v;
58  sum2 += v * v;
59  n++;
60  }
61  mean[x1 + offset + (y1 + offset) * width2] =
62  (double) (sum / (double) n);
63  variance[x1 + offset + (y1 + offset) * width2] =
64  (double) ((sum2 / (double) n) -
65  mean[x1 + offset + (y1 + offset) * width2] *
66  mean[x1 + offset + (y1 + offset) * width2]);
67  }
68  }
69 
70  int xbase2 = 0, ybase2 = 0;
71  double var, Min;
72  for (int y1 = 0; y1 < H; y1++)
73  for (int x1 = 0; x1 < W; x1++) {
74  Min = 9999999;
75  xbase = x1;
76  ybase = y1;
77  var = variance[xbase + ybase * width2];
78  if (var < Min) {
79  Min = var;
80  xbase2 = xbase;
81  ybase2 = ybase;
82  }
83  xbase = x1 + offset;
84  var = variance[xbase + ybase * width2];
85  if (var < Min) {
86  Min = var;
87  xbase2 = xbase;
88  ybase2 = ybase;
89  }
90  ybase = y1 + offset;
91  var = variance[xbase + ybase * width2];
92  if (var < Min) {
93  Min = var;
94  xbase2 = xbase;
95  ybase2 = ybase;
96  }
97  xbase = x1;
98  var = variance[xbase + ybase * width2];
99  if (var < Min) {
100  Min = var;
101  xbase2 = xbase;
102  ybase2 = ybase;
103  }
104  bufferOut[x1 + y1 * W] = (T)(mean[xbase2 + ybase2 * width2]);
105  }
106 
107  delete[] variance;
108  delete[] mean;
109 
110  return RES_OK;
111  }
112 
113  template <class T1, class T2>
114  RES_T kuwaharaFilterRGB(const Image<T1> &imIn, const int radius,
115  Image<T2> &imOut)
116  {
117  return RES_OK;
118  }
119 
120 } // namespace smil
121 #endif
void getSize(size_t *w, size_t *h, size_t *d) const
Get image size.
Definition: DBaseImage.h:118
Definition: DBaseImage.h:386
Main Image class.
Definition: DImage.hpp:57
lineType getPixels() const
Get the pixels as a 1D array.
Definition: DImage.hpp:105
RES_T kuwaharaFilter(const Image< T > &imIn, const int radius, Image< T > &imOut)
kuwaharaFilter Kuwahara Filter
Definition: filterKuwahara.hpp:7
RES_T kuwaharaFilterRGB(const Image< T > &imIn, const int radius, Image< T > &imOut)
kuwaharaFilterRGB Kuwahara Filter (color images)
RES_T mean(const Image< T > &imIn, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Mean filter.
Definition: DMorphoFilter.hpp:258