The VisAO Camera
improcessing.cpp
1 
2 #include "improcessing.h"
3 
4 double gaussian2D(double dx, double dy, double sigx, double sigy)
5 {
6  return exp(-0.5*(pow(dx/sigx,2) + pow(dy/sigy,2)));
7 }
8 
9 
10 int gaussKernel(double * kernel, size_t dim1, size_t dim2, double sig)
11 {
12  double xcen = ((int) (0.5*(((double)dim1) - 1.) ));
13  double ycen = ((int) (0.5*(((double)dim2) - 1.) ));
14 
15 
16  size_t i, j;
17 
18  double total = 0;
19  for(i=0;i<dim1;i++)
20  {
21  for(j=0;j<dim2;j++)
22  {
23  kernel[j*dim1+i] = gaussian2D((double)i-xcen, (double)j-ycen, sig, sig);
24  total += kernel[j*dim1+i];
25  }
26  }
27 
28  for(i=0;i<dim1;i++)
29  {
30  for(j=0;j<dim2;j++)
31  {
32  kernel[j*dim1+i] /= total;
33  }
34  }
35 
36 }
37 
38 int applyKernel(double *smim, double *im, size_t dim1, size_t dim2, double *kern, size_t kdim1, size_t kdim2)
39 {
40  double xcen = ((int) (0.5*(((double)kdim1) - 1.)));
41  double ycen = ((int) (0.5*(((double)kdim2) - 1.)));
42 
43  double sum;
44  double ktot;
45 
46  size_t i, j, k, l;
47 
48  long ix, jx;
49 
50  for(i =0; i< dim1; i++)
51  {
52  for(j=0; j<dim2; j++)
53  {
54  sum = 0;
55  ktot = 0;
56 
57  for(k=0;k<kdim1;k++)
58  {
59  for(l=0;l<kdim2;l++)
60  {
61  ix = i - (xcen-k);
62  jx = j - (ycen-l);
63 
64  if( ix >= 0 and (size_t) ix < dim1 and jx >=0 and (size_t) jx < dim2)
65  {
66  sum += kern[l*kdim1+k] * im[jx*dim1 + ix];
67  ktot += kern[l*kdim1+k];
68  }
69  }
70  }
71 
72  smim[j*dim1+i] = sum/ktot;
73  }
74  }
75 
76  return 0;
77 }
78 
79 /*
80 #include <iostream>
81 int main()
82 {
83  size_t kdim = 40., dim1 = 37., dim2=52;
84 
85  double *im, *smim, *kern;
86 
87  im = new double[dim1*dim2];
88  smim = new double[dim1*dim2];
89 
90  kern = new double[kdim*kdim];
91 
92  gaussKernel(im, dim1, dim2, 3./GSIG2FW);
93 
94  gaussKernel(kern, kdim, kdim, 10./GSIG2FW);
95 
96  applyKernel(smim, im, dim1, dim2, kern, kdim, kdim);
97 
98 
99  double imv, totl = 0;
100  int idx;
101  double xcen = 0, ycen = 0;
102  for(size_t i=0;i<dim1;i++)
103  {
104  for(size_t j=0;j<dim2;j++)
105  {
106  idx = j*dim1+i;
107  imv = im[idx] - smim[idx];
108 
109  if(isnan(imv)) continue;
110 
111  totl += imv;
112 
113  xcen += imv*i;
114  ycen += imv*j;
115 
116  }
117  }
118 
119  xcen /= totl;
120  ycen /= totl;
121 
122  std::cerr << xcen << " " << ycen << "\n";
123 
124  for(int i=0;i<dim1;i++)
125  {
126  for(int j=0;j<dim2;j++)
127  {
128  std::cout << im[j*dim1 + i] << " " << smim[j*dim1 + i] << "\n";
129  }
130  }
131 }
132 */
133