source: tags/release-1.0.5/src/Utils/sigma_factors.cc @ 1455

Last change on this file since 1455 was 3, checked in by Matthew Whiting, 18 years ago

This is the first full import of all working code to
the Duchamp repository.
Made three directories at top level:

branches/ tags/ trunk/

and trunk/ has the full set of code:
ATrous/ Cubes/ Detection/ InputComplete? InputExample? README Utils/ docs/ mainDuchamp.cc param.cc param.hh

File size: 9.3 KB
Line 
1#include <iostream>
2#include <iomanip>
3#include <ATrous/atrous.hh>
4#define DEBUG true
5
6void getSigmaFactors1DNew(int &numScales)
7{
8//   extern Filter reconFilter;
9//   std::cerr<<"-->"<<reconFilter.getName()<<"<--"<<std::endl; 
10  std::cerr << "-->"<<Filter::getName()<<"<--"<<std::endl;
11  std::cerr << "-->"<<getNumScales(125)<<"<--"<<std::endl;
12 
13//   int filterHW = reconFilter.width()/2;
14  int filterwidth = Filter::width();
15  int filterHW = Filter::width()/2;
16
17  // starting values:
18  long xdim = 1;
19  long size = xdim;
20  double *c = new double[size];
21  double *w = new double[size];
22  w[0] = 1.;
23
24  double *filter = new double[filterwidth];
25//   for(int i=0;i<filterwidth;i++) filter[i] = reconFilter.coeff(i);
26  for(int i=0;i<filterwidth;i++) filter[i] = Filter::coeff(i);
27 
28  int spacing = 1;
29//   const float FACTOR = 16.;
30//   const float FACTOR = 1./reconFilter.coeff(0);
31  const float FACTOR = 1.;
32  const float FACFAC = FACTOR*FACTOR;
33
34  if(DEBUG){
35    std::cout << "divide by " << pow(FACTOR,0) << std::endl;
36    for(int i=0;i<size;i++){
37      std::cout<<i<<" "<<w[i]<<std::endl;
38    }
39    std::cout<<"===============\n";
40  }
41
42  for(int scale = 1; scale<=numScales; scale++){
43
44    // re-size and incorporate previous w into new c
45    long oldsize = size;
46    long oldxdim = xdim;
47//     xdim = 2 * xdim + 3;
48//     xdim = reconFilter.getMaxSize(scale);
49    xdim += filterHW*long(pow(2,scale));
50    size = xdim;
51    double *newc = new double[size];
52    for(int i=0;i<size;i++){
53      int oldpos = i - xdim/2;
54      if(// (oldpos<oldsize)&&(oldpos>=0)
55         abs(oldpos)<=oldsize/2) newc[i] = w[oldpos+oldsize/2] * FACTOR;
56      else newc[i] = 0.;
57     
58      if(DEBUG) std::cout<<i<<" "<<oldpos<<" "<<size<<" "<<oldsize<<" "<<oldsize/2<<"   "
59                         <<newc[i]// *pow(16,scale-1)
60                         <<std::endl;
61    }
62    if(DEBUG) std::cout<<"---------------\nspacing = " << spacing << std::endl;
63    delete [] c;
64    c = newc;
65    double *neww = new double[size];
66    delete [] w;
67    w = neww;
68    for(int i=0;i<size;i++) w[i] = 0.;
69
70    long double sum = 0.;
71
72    for(int xpos = 0; xpos<xdim; xpos++){
73      // loops over each pixel in the image
74      w[xpos] = 0;
75
76      for(int xoffset=-filterHW; xoffset<=filterHW; xoffset++){
77        int x = xpos + spacing*xoffset;
78        int filterpos = (xoffset+filterHW);
79        if((x>=0)&&(x<xdim))  // if outside boundary --> set to 0.
80          w[xpos] += filter[filterpos] * c[x];
81      } //-> end of xoffset loop
82       
83      sum += (c[xpos]-w[xpos])*(c[xpos]-w[xpos]) / pow(FACFAC,scale);
84
85    } //-> end of xpos loop
86
87    if(DEBUG){
88      std::cout << "divide by " << pow(FACTOR,scale) << std::endl;
89      for(int i=0;i<size;i++){
90        std::cout<<i<<" "<<w[i]// *pow(16,scale)
91                 <<std::endl;
92      }
93      std::cout<<"===============\n";
94    }
95
96    std::cerr << "Scale "<<std::setw(2)<<scale<<":";
97    std::cerr.setf(std::ios::scientific);
98    std::cerr.setf(std::ios::left);
99    std::cerr <<"\t1D = "<<std::setw(15)<<std::setprecision(9)<<sqrt(sum)<<std::endl;
100    std::cerr.unsetf(std::ios::left);
101     
102
103    spacing *= 2;
104
105  } //-> end of scale loop
106
107}
108
109void getSigmaFactors2DNew(int &numScales)
110{
111/*
112
113 
114  extern Filter reconFilter;
115  int filterHW = reconFilter.width()/2;
116  int fsize = reconFilter.width()*reconFilter.width();
117  double *filter = new double[fsize];
118  for(int i=0;i<reconFilter.width();i++){
119    for(int j=0;j<reconFilter.width();j++){
120      filter[i +j*reconFilter.width()] = reconFilter.coeff(i) * reconFilter.coeff(j);
121    }
122  }
123
124 
125  // starting values:
126  long xdim = 1;
127  long size = xdim*xdim*xdim;
128  double *c = new double[size];
129  double *w = new double[size];
130  w[0] = 1.;
131
132  int spacing = 1;
133//   const float FACTOR = 1./(reconFilter.coeff(0)*reconFilter.coeff(0));
134//   const float FACTOR = 16.*16.;
135  const float FACTOR = 1.;
136  const float FACFAC = FACTOR * FACTOR;
137
138  for(int scale = 1; scale<=numScales; scale++){
139
140    // re-size and incorporate previous w into new c
141    long oldsize = size;
142    long oldxdim = xdim;
143//     xdim = 2 * oldxdim + 3;
144    xdim += filterHW*long(pow(2,scale));
145    size = xdim * xdim;
146    double *newc = new double[size];
147    for(int i=0;i<size;i++){
148      int x = i%xdim;
149      int y = i/xdim;
150      int centrepos=0;
151      if((abs(x-xdim/2)<=oldxdim/2)&&(abs(y-xdim/2)<=oldxdim/2)){
152        centrepos = x-xdim/2+oldxdim/2 + oldxdim*(y-xdim/2+oldxdim/2);
153        newc[i] = w[centrepos] * FACTOR;
154      }
155      else newc[i] = 0.;
156//       std::cout<<i<<" "<<x<<" "<<y<<" "<<centrepos<<" "<<xdim<<" "<<size
157//             <<" "<<oldxdim<<" "<<oldsize<<"   "<<newc[i]*pow(256,scale-1)<<std::endl;
158    }
159//     std::cout<<"---------------\n";
160    delete [] c;
161    c = newc;
162//     std::cerr<<".";
163    double *neww = new double[size];
164    delete [] w;
165    w = neww;
166    for(int i=0;i<size;i++) w[i] = 0.;
167//     std::cerr<<".";
168
169    long double sum = 0.;
170
171    for(int ypos = 0; ypos<xdim; ypos++){
172      for(int xpos = 0; xpos<xdim; xpos++){
173        // loops over each pixel in the image
174        int pos = ypos*xdim + xpos;
175        w[pos] = 0;
176
177        for(int yoffset=-filterHW; yoffset<=filterHW; yoffset++){
178          int y = ypos + spacing*yoffset;
179
180          for(int xoffset=-filterHW; xoffset<=filterHW; xoffset++){
181            int x = xpos + spacing*xoffset;
182
183            int filterpos = (yoffset+filterHW)*reconFilter.width() + (xoffset+filterHW);
184            int oldpos = y*xdim + x;
185                   
186            if((y>=0)&&(y<xdim)&&(x>=0)&&(x<xdim))
187              w[pos] += filter[filterpos] * c[oldpos];
188
189          } //-> end of xoffset loop
190        } //-> end of yoffset loop
191 
192        sum += (c[pos]-w[pos])*(c[pos]-w[pos]) / pow(FACFAC,scale);
193           
194      } //-> end of xpos loop
195    } //-> end of ypos loop
196
197//     for(int i=0;i<size;i++){
198//       std::cout<<i<<" "<<i%xdim<<" "<<i/xdim<<" "<<w[i]*pow(256,scale)<<std::endl;
199//     }
200//     std::cout<<"===============\n";
201
202    std::cerr << "Scale "<<std::setw(2)<<scale<<":";
203    std::cerr.setf(std::ios::scientific);
204    std::cerr.setf(std::ios::left);
205    std::cerr <<"\t2D = "<<std::setw(11)<<std::setprecision(9)<<sqrt(sum)<<std::endl;
206    std::cerr.unsetf(std::ios::left);
207     
208    spacing *= 2;
209
210  } //-> end of scale loop
211
212*/
213
214}
215
216
217void getSigmaFactors3DNew(int &numScales)
218{
219  /* 
220  extern Filter reconFilter;
221  int filterHW = reconFilter.width()/2;
222  int fsize = reconFilter.width()*reconFilter.width()*reconFilter.width();
223  double *filter = new double[fsize];
224  for(int i=0;i<reconFilter.width();i++){
225    for(int j=0;j<reconFilter.width();j++){
226      for(int k=0;k<reconFilter.width();k++){
227        filter[i +j*reconFilter.width() + k*reconFilter.width()*reconFilter.width()] =
228          reconFilter.coeff(i) * reconFilter.coeff(j) * reconFilter.coeff(k);
229      }
230    }
231  }
232
233  // starting values:
234  long xdim = 1;
235  long size = xdim*xdim*xdim;
236  double *c = new double[size];
237  double *w = new double[size];
238  int x,y,z,centrepos;
239  w[0] = 1.;
240 
241  int spacing = 1;
242//   const float FACTOR = 16.*16.*16.;
243  const float FACTOR = 1.;
244  const float FACFAC = FACTOR * FACTOR;
245
246  for(int scale = 1; scale<=numScales; scale++){
247
248    // re-size and incorporate previous w into new c
249    long oldsize = size;
250    long oldxdim = xdim;
251//     xdim = 2 * xdim + 3;
252    xdim += filterHW*long(pow(2,scale));
253    size = xdim * xdim * xdim;
254    double *newc = new double[size];
255    for(int i=0;i<size;i++){
256      x = i%xdim;
257      y = (i/xdim) % xdim;
258      z = i / (xdim*xdim);
259      centrepos = 0;
260      if((abs(x-xdim/2)<=oldxdim/2)&&
261         (abs(y-xdim/2)<=oldxdim/2)&&
262         (abs(z-xdim/2)<=oldxdim/2)){
263        centrepos = x-xdim/2+oldxdim/2 + oldxdim*(y-xdim/2+oldxdim/2)
264          + oldxdim*oldxdim*(z-xdim/2+oldxdim/2);
265        newc[i] = w[centrepos] * FACTOR;
266      }
267      else newc[i] = 0.;
268//       std::cout<<i<<" "<<x<<" "<<y<<" "<<z<<" "<<oldpos<<" "<<size<<" "<<oldsize
269//             <<"   "<<newc[i]*pow(16,3*(scale-1))<<std::endl;
270    }
271//     std::cout<<"---------------\n";
272    delete [] c;
273    c = newc;
274    double *neww = new double[size];
275    delete [] w;
276    w = neww;
277    for(int i=0;i<size;i++) w[i] = 0.;
278    long double sum = 0.;
279
280    for(int zpos = 0; zpos<xdim; zpos++){
281      for(int ypos = 0; ypos<xdim; ypos++){
282        for(int xpos = 0; xpos<xdim; xpos++){
283          // loops over each pixel in the image
284          int pos = zpos*xdim*xdim + ypos*xdim + xpos;
285          w[pos] = 0;
286
287          for(int zoffset=-filterHW; zoffset<=filterHW; zoffset++){
288            z = zpos + spacing*zoffset;
289            for(int yoffset=-filterHW; yoffset<=filterHW; yoffset++){
290              y = ypos + spacing*yoffset;
291              for(int xoffset=-filterHW; xoffset<=filterHW; xoffset++){
292                x = xpos + spacing*xoffset;
293
294                int filterpos = (zoffset+filterHW)*reconFilter.width()*reconFilter.width() +
295                  (yoffset+filterHW)*reconFilter.width() + (xoffset+filterHW);
296                int oldpos = z*xdim*xdim + y*xdim + x;
297
298                // only consider points inside boundary -- ie. =0 outside
299                if((z>=0)&&(z<xdim)&&(y>=0)&&(y<xdim)&&(x>=0)&&(x<xdim))
300                  w[pos] += filter[filterpos] * c[oldpos];
301
302              } //-> end of xoffset loop
303            } //-> end of yoffset loop
304          } //-> end of zoffset loop
305 
306          sum += (c[pos]-w[pos])*(c[pos]-w[pos]) / pow(FACFAC,scale);
307           
308        } //-> end of xpos loop
309      } //-> end of ypos loop
310    } //-> end of zpos loop
311
312//     for(int i=0;i<size;i++){
313//       std::cout<<i<<" "<<w[i]*pow(16,3*scale)<<std::endl;
314//     }
315//     std::cout<<"===============\n";
316
317    std::cerr << "Scale "<<std::setw(2)<<scale<<":";
318    std::cerr.setf(std::ios::scientific);
319    std::cerr.setf(std::ios::left);
320    std::cerr <<"\t3D = "<<std::setw(11)<<std::setprecision(9)<<sqrt(sum)<<std::endl;
321    std::cerr.unsetf(std::ios::left);
322
323    spacing *= 2;
324
325  } //-> end of scale loop
326
327*/
328
329
330}
Note: See TracBrowser for help on using the repository browser.