source: tags/release-0.9/ATrous/atrous.cc

Last change on this file 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: 6.0 KB
Line 
1// ATROUS.CC
2//  Functions necessary for the reconstruction routines.
3#include <iostream>
4#include <ATrous/atrous.hh>
5#include <math.h>
6
7// int getNumScales(long length)
8// {
9//   switch(filterwidth){
10//   case 5:
11//     return int(logf(float(length-1))/M_LN2) - 1;
12//     break;
13//   case 3:
14//     return int(logf(float(length-1))/M_LN2);
15//     break;
16//   default:
17//     return 1 + int(logf(float(length-1)/float(filterwidth-1))/M_LN2);
18//     break;
19//   }
20// }
21
22int Filter::getNumScales(long length)
23{
24  switch(this->filter1D.size()){
25//   switch(filter1D.size()){
26  case 5:
27    return int(logf(float(length-1))/M_LN2) - 1;
28    break;
29  case 3:
30    return int(logf(float(length-1))/M_LN2);
31    break;
32  default:
33    return 1 + int(logf(float(length-1)/float(this->filter1D.size()-1))/M_LN2);
34//     return 1 + int(logf(float(length-1)/float(filter1D.size()-1))/M_LN2);
35    break;
36  }
37}
38
39// int getNumScales(long length)
40// {
41//   switch(Filter::width()){
42//   case 5:
43//     return int(logf(float(length-1))/M_LN2) - 1;
44//     break;
45//   case 3:
46//     return int(logf(float(length-1))/M_LN2);
47//     break;
48//   default:
49//     return 1 + int(logf(float(length-1)/float(Filter::width()-1))/M_LN2);
50//     break;
51//   }
52// }
53
54int Filter::getMaxSize(int scale)
55{
56  switch(this->filter1D.size()){
57  case 5:
58    return int(pow(2,scale+1)) + 1;
59    break;
60  case 3:
61    return int(pow(2,scale)) + 1;
62    break;
63  default:
64    return int(pow(2,scale-1))*(this->filter1D.size()-1) + 1;
65    break;
66  }
67}
68
69Filter::Filter()
70{
71  this->sigmaFactors.resize(3);
72  for(int i=0;i<3;i++) this->sigmaFactors[i] = new vector<double>(20);
73}
74
75
76void Filter::define(int filtercode)
77{
78  switch(filtercode)
79    {
80    case 2:
81      this->loadTriangle();
82      break;
83    case 3:
84      this->loadHaar();
85      break;
86    case 4:
87      //       this->loadTopHat();
88    case 1:
89    default:
90      if(filtercode!=1){
91        if(filtercode==4)
92          std::cerr << "TopHat Wavelet not being used currently. Using B3 spline instead.\n";
93        else
94          std::cerr << "Filter code " << filtercode << " undefined. Using B3 spline.\n";
95      }
96      this->loadSpline();
97      break;
98    }
99 
100}
101
102void Filter::loadSpline()
103{
104  double filter[5] = {0.0625, 0.25, 0.375, 0.25, 0.0625};
105  this->name = "B3 spline function";
106  this->filter1D.resize(5);
107  for(int i=0;i<5;i++) this->filter1D[i] = filter[i];
108  this->sigmaFactors.resize(3);
109  this->maxNumScales.resize(3);
110
111  this->maxNumScales[0] = 18;
112  double sigmaFactors1D[19] = {1.00000000000,7.23489806e-1,2.85450405e-1,1.77947535e-1,
113                               1.22223156e-1,8.58113122e-2,6.05703043e-2,4.28107206e-2,
114                               3.02684024e-2,2.14024008e-2,1.51336781e-2,1.07011079e-2,
115                               7.56682272e-3,5.35055108e-3,3.78341085e-3,2.67527545e-3,
116                               1.89170541e-3,1.33763772e-3,9.45852704e-4};
117  this->sigmaFactors[0]->resize(19);
118  for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
119
120  this->maxNumScales[1] = 11;
121  double sigmaFactors2D[12] = {1.00000000000,8.90796310e-1,2.00663851e-1,8.55075048e-2,
122                               4.12474444e-2,2.04249666e-2,1.01897592e-2,5.09204670e-3,
123                               2.54566946e-3,1.27279050e-3,6.36389722e-4,3.18194170e-4};
124  this->sigmaFactors[1]->resize(12);
125  for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
126
127  this->maxNumScales[2] = 7;
128  double sigmaFactors3D[8] = {1.00000000000,9.56543592e-1,1.20336499e-1,3.49500154e-2,
129                              1.18164242e-2,4.13233507e-3,1.45703714e-3,5.14791120e-4};
130  this->sigmaFactors[2]->resize(8);
131  for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
132}
133
134void Filter::loadTriangle()
135{
136  double filter[3] = {1./4., 1./2., 1./4.};
137  this->filter1D.resize(3);
138  for(int i=0;i<3;i++) this->filter1D[i] = filter[i];
139  this->name = "Triangle function";
140  this->sigmaFactors.resize(3);
141  this->maxNumScales.resize(3);
142
143  this->maxNumScales[0] = 18;
144  double sigmaFactors1D[19] = {1.00000000000,6.12372436e-1,3.30718914e-1,2.11947812e-1,
145                               1.45740298e-1,1.02310944e-1,7.22128185e-2,5.10388224e-2,
146                               3.60857673e-2,2.55157615e-2,1.80422389e-2,1.27577667e-2,
147                               9.02109930e-3,6.37887978e-3,4.51054902e-3,3.18942978e-3,
148                               2.25527449e-3,1.59471988e-3,1.12763724e-4};
149  this->sigmaFactors[0]->resize(19);
150  for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
151
152  this->maxNumScales[1] = 12;
153  double sigmaFactors2D[13] = {1.00000000000,8.00390530e-1,2.72878894e-1,1.19779282e-1,
154                               5.77664785e-2,2.86163283e-2,1.42747506e-2,7.13319703e-3,
155                               3.56607618e-3,1.78297280e-3,8.91478237e-4,4.45738098e-4,
156                               2.22868922e-4};
157  this->sigmaFactors[1]->resize(13);
158  for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
159
160  this->maxNumScales[2] = 8;
161  double sigmaFactors3D[9] = {1.00000000000,8.959544490e-1,1.92033014e-1,5.76484078e-2,
162                              1.94912393e-2,6.812783870e-3,2.40175885e-3,8.48538128e-4,
163                              2.99949455e-4};
164  this->sigmaFactors[2]->resize(9);
165  for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
166}
167
168void Filter::loadHaar()
169{
170  double filter[3] = {0., 1./2., 1./2.};
171  this->name = "Haar wavelet";
172  this->filter1D.resize(3);
173  for(int i=0;i<3;i++) this->filter1D[i] = filter[i];
174  this->sigmaFactors.resize(3);
175  this->maxNumScales.resize(3);
176
177  this->maxNumScales[0] = 6;
178  double sigmaFactors1D[7] = {1.00000000000,7.07167810e-1,5.00000000e-1,3.53553391e-1,
179                              2.50000000e-1,1.76776695e-1,1.25000000e-1};
180  this->sigmaFactors[0]->resize(7);
181  for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
182
183  this->maxNumScales[1] = 6;
184  double sigmaFactors2D[7] = {1.00000000000,4.33012702e-1,2.16506351e-1,1.08253175e-1,
185                              5.41265877e-2,2.70632939e-2,1.35316469e-2};
186  this->sigmaFactors[1]->resize(7);
187  for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
188
189  this->maxNumScales[2] = 8;
190  double sigmaFactors3D[9] = {1.00000000000,9.35414347e-1,3.30718914e-1,1.16926793e-1,
191                              4.13398642e-2,1.46158492e-2,5.16748303e-3,1.82698115e-3,
192                              6.45935379e-4};
193  this->sigmaFactors[2]->resize(9);
194  for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
195}
Note: See TracBrowser for help on using the repository browser.