source: branches/fitshead-branch/ATrous/atrous_reconstruct.cc @ 1441

Last change on this file since 1441 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.6 KB
Line 
1#include <iostream>
2#include <math.h>
3#include <ATrous/atrous.hh>
4//#include <Cubes/cubes.hh>
5#include <Utils/utils.hh>
6
7using namespace std;
8void atrous1DReconstructOLD(long &size, float *input,float *output, Param &par)
9{
10  const float SNR_THRESH=par.getAtrousCut();
11  const int MIN_SCALE=par.getMinScale();
12
13  int numScales = getNumScales(size);
14  /*
15  if(numScales>maxNumScales1D){
16    cerr<<"Error in atrous1DReconstruct:: numScales ("<<numScales<<") > "<<maxNumScales1D<<"\n";
17    cerr<<"Don't have correction factors for this many scales...\n";
18    cerr<<"Exiting...\n";
19    exit(1);
20  }
21  */
22  double *sigmaFactors = new double[numScales+1];
23  for(int i=0;i<=numScales;i++){
24    if(i<=maxNumScales1D) sigmaFactors[i] = sigmaFactors1D[i];
25    else sigmaFactors[i] = sigmaFactors[i-1] / sqrt(2.);
26  }
27
28
29  double *coeffs = new double[(numScales+1)*size];
30  double *wavelet = new double[(numScales+1)*size];
31
32  atrousTransform(size,numScales,input,coeffs,wavelet);
33
34  for(int pos=0;pos<size;pos++) output[pos]=0.;
35
36  float *array = new float[size];
37  float mean,sigma,originalSigma,originalMean;
38  findMedianStats(input,size,originalMean,originalSigma);
39  for(int scale=MIN_SCALE;scale<numScales;scale++){
40    for(int pos=0;pos<size;pos++) array[pos] = wavelet[scale*size + pos];
41    findMedianStats(array,size,mean,sigma);
42    for(int pos=0;pos<size;pos++){
43      if( fabs(wavelet[scale*size+pos])>(mean+SNR_THRESH*originalSigma*sigmaFactors[scale]))
44        output[pos] += wavelet[scale*size+pos];
45    }
46  }
47  for(int pos=0;pos<size;pos++)
48    output[pos] += coeffs[numScales*size+pos];
49  float *residual = new float[size];
50  for(int pos=0;pos<size;pos++)
51    residual[pos] = input[pos] - output[pos];
52  float oldsigma,newsigma;
53  do{
54    findMedianStats(residual,size,mean,oldsigma);
55    atrousTransform(size,numScales,residual,coeffs,wavelet);
56    for(int scale=MIN_SCALE;scale<numScales;scale++){
57      for(int pos=0;pos<size;pos++) array[pos] = wavelet[scale*size+pos];
58      findMedianStats(array,size,mean,sigma);
59      for(int pos=0;pos<size;pos++){
60        if(fabs(wavelet[scale*size+pos]) >
61           (mean+SNR_THRESH*originalSigma*sigmaFactors[scale]))
62          output[pos] += wavelet[scale*size+pos];
63      }
64    }
65    for(int pos=0;pos<size;pos++) output[pos] += coeffs[numScales*size+pos];
66    for(int pos=0;pos<size;pos++) residual[pos] = input[pos] - output[pos];
67    findMedianStats(residual,size,mean,newsigma);
68  }while( fabsf(oldsigma-newsigma)/newsigma > reconTolerance);
69
70  delete [] coeffs;
71  delete [] wavelet;
72  delete [] residual;
73  delete [] array;
74}
75
76
77
78void atrous2DReconstructOLD(long &xdim, long &ydim, float *input,float *output, Param &par)
79{
80  const float SNR_THRESH=par.getAtrousCut();
81  const int MIN_SCALE=par.getMinScale();
82  bool flagBlank=par.getFlagBlankPix();
83  float blankPixValue = par.getBlankPixVal();
84  long size = xdim * ydim;
85  long mindim = xdim;
86  if (ydim<mindim) mindim = ydim;
87  int numScales = getNumScales(mindim);
88  if(numScales>maxNumScales2D){
89    cerr<<"Error in atrous2DReconstruct:: numScales ("<<numScales<<") > "<<maxNumScales2D<<"\n";
90    cerr<<"Don't have correction factors for this many scales...\n";
91    cerr<<"XDIM = "<<xdim<<", YDIM = "<<ydim<<endl;
92    cerr<<"Exiting...\n";
93    exit(1);
94  }
95
96  double *coeffs = new double[size];
97  double *wavelet = new double[(numScales+1)*size];
98
99  atrousTransform2D(xdim,ydim,numScales,input,coeffs,wavelet,par);
100
101  for(int pos=0;pos<size;pos++) output[pos]=0.;
102
103  bool *isGood = new bool[size];
104  for(int pos=0;pos<size;pos++)// isGood[pos] = (!flagBlank) || (input[pos]!=blankPixValue);
105    isGood[pos] = !par.isBlank(input[pos]);
106
107  float mean,sigma,originalSigma,originalMean;
108  // Only get stats for the non-blank pixels.
109  float *array = new float[size];
110  int goodSize=0;
111  for(int i=0;i<size;i++) if(isGood[i]) array[goodSize++] = input[i];
112  findMedianStats(array,goodSize,originalMean,originalSigma);
113  delete [] array;
114
115  for(int scale=MIN_SCALE;scale<=numScales;scale++){
116    array = new float[size];
117    goodSize=0;
118    for(int pos=0;pos<size;pos++)
119      if(isGood[pos]) array[goodSize++] = wavelet[scale*size + pos];
120    findMedianStats(array,goodSize,mean,sigma);
121    delete [] array;
122
123    for(int pos=0;pos<size;pos++){
124      // preserve the Blank pixel values in the output.
125      if(!isGood[pos]) output[pos] = blankPixValue;
126      else if( fabs(wavelet[scale*size+pos]) >
127               (mean+SNR_THRESH*originalSigma*sigmaFactors2D[scale]) ){
128        output[pos] += wavelet[scale*size+pos];
129      }
130    }
131  }
132  for(int pos=0;pos<size;pos++) if(isGood[pos]) output[pos] += coeffs[pos];
133
134  float *residual = new float[size];
135  for(int pos=0;pos<size;pos++)
136    residual[pos] = input[pos] - output[pos];
137
138  float oldsigma,newsigma;
139  do{
140    array = new float[size];
141    goodSize=0;
142    for(int i=0;i<size;i++) if(isGood[i]) array[goodSize++] = residual[i];
143    findMedianStats(array,goodSize,mean,oldsigma);
144    delete [] array;
145
146    cerr<<"\nIn atrous2DReconstruct, setting bad bits to BLANK in residual before transform.\n";
147    for(int i=0;i<size;i++) if(!isGood[i]) residual[i]=blankPixValue;
148    atrousTransform2D(xdim,ydim,numScales,residual,coeffs,wavelet,par);
149    for(int i=0;i<size;i++) if(!isGood[i]) residual[i]=0;
150   
151    for(int scale=MIN_SCALE;scale<=numScales;scale++){
152
153      array = new float[size];
154      goodSize=0;
155      for(int pos=0;pos<size;pos++)
156        if(isGood[pos]) array[goodSize++] = wavelet[scale*size+pos];
157      findMedianStats(array,goodSize,mean,sigma);
158      delete [] array;
159
160      for(int pos=0;pos<size;pos++){
161        if(!isGood[pos]) output[pos] = blankPixValue;
162        else if(fabs(wavelet[scale*size+pos]) >
163                (mean+SNR_THRESH*originalSigma*sigmaFactors2D[scale]))
164          output[pos] += wavelet[scale*size+pos];
165      }
166    }
167    for(int pos=0;pos<size;pos++) if(isGood[pos]) output[pos] += coeffs[pos];
168    for(int pos=0;pos<size;pos++) residual[pos] = input[pos] - output[pos];
169
170    array = new float[size];
171    goodSize=0;
172    for(int i=0;i<size;i++) if(isGood[i]) array[goodSize++] = residual[i];
173    findMedianStats(array,goodSize,mean,newsigma);
174    delete [] array;
175  }while( fabsf(oldsigma-newsigma)/newsigma > reconTolerance);
176
177
178  delete [] coeffs;
179  delete [] wavelet;
180  delete [] residual;
181}
182
183
184void atrous3DReconstructOLD(long &xdim, long &ydim, long &zdim, float *&input,float *&output, Param &par)
185{
186  const float SNR_THRESH=par.getAtrousCut();
187  const int MIN_SCALE=par.getMinScale();
188  bool flagBlank=par.getFlagBlankPix();
189  float blankPixValue = par.getBlankPixVal();
190  long size = xdim * ydim * zdim;
191  long mindim = xdim;
192  if (ydim<mindim) mindim = ydim;
193  if (zdim<mindim) mindim = zdim;
194  int numScales = getNumScales(mindim);
195  if(numScales>maxNumScales3D){
196    cerr<<"Error in atrous3DReconstruct:: numScales ("<<numScales<<") > "<<maxNumScales3D<<"\n";
197    cerr<<"Don't have correction factors for this many scales...\n";
198    cerr<<"Exiting...\n";
199    exit(1);
200  }
201
202  float mean,sigma,originalSigma,originalMean;
203  bool *isGood = new bool[size];
204  for(int pos=0;pos<size;pos++)// isGood[pos] = (!flagBlank) || (input[pos]!=blankPixValue);
205    isGood[pos] = !par.isBlank(input[pos]);
206 
207  float *array = new float[size];
208  int goodSize=0;
209  for(int i=0;i<size;i++) if(isGood[i]) array[goodSize++] = input[i];
210  findMedianStats(array,goodSize,originalMean,originalSigma);
211  delete [] array;
212
213  float *coeffs = new float[size];
214  float *wavelet = new float[(numScales+1)*size];
215  float *residual = new float[size];
216
217  cerr << size<<" ";
218  atrousTransform3D(xdim,ydim,zdim,numScales,input,coeffs,wavelet,par);
219  cerr <<",";
220  for(int pos=0;pos<size;pos++) output[pos]=0.;
221  cerr <<",";
222
223  for(int scale=MIN_SCALE;scale<=numScales;scale++){
224    cerr<<",";
225    array = new float[size];
226    goodSize=0;
227    for(int pos=0;pos<size;pos++)
228      if(isGood[pos]) array[goodSize++] = wavelet[scale*size + pos];
229    findMedianStats(array,goodSize,mean,sigma);
230    delete [] array;
231
232    for(int pos=0;pos<size;pos++){
233      // preserve the Blank pixel values in the output.
234      if(!isGood[pos]) output[pos] = blankPixValue;
235      else if( fabs(wavelet[scale*size+pos])>
236               (mean+SNR_THRESH*originalSigma*sigmaFactors3D[scale]))
237        output[pos] += wavelet[scale*size+pos];
238    }
239  }
240  for(int pos=0;pos<size;pos++) if(isGood[pos]) output[pos] += coeffs[pos];
241
242  for(int pos=0;pos<size;pos++) residual[pos] = input[pos] - output[pos];
243
244  float oldsigma,newsigma;
245  cerr<<"!";
246  array = new float[size];
247  goodSize=0;
248  for(int i=0;i<size;i++) if(isGood[i]) array[goodSize++] = residual[i];
249  findMedianStats(array,goodSize,mean,newsigma);
250  delete [] array;
251  do{
252    oldsigma = newsigma;
253    cerr<<"!"<<oldsigma;
254    atrousTransform3D(xdim,ydim,zdim,numScales,residual,coeffs,wavelet,par);
255    cerr<<"!";
256    for(int scale=MIN_SCALE;scale<numScales;scale++){
257
258      array = new float[size];
259      goodSize=0;
260      for(int pos=0;pos<size;pos++)
261        if(isGood[pos]) array[goodSize++] = wavelet[scale*size+pos];
262      findMedianStats(array,goodSize,mean,sigma);
263      delete [] array;
264
265      for(int pos=0;pos<size;pos++){
266        if(!isGood[pos]) output[pos] = blankPixValue;
267        else if( fabs(wavelet[scale*size+pos]) >
268                 (mean+SNR_THRESH*originalSigma*sigmaFactors3D[scale]))
269          output[pos] += wavelet[scale*size+pos];
270      }
271    }
272    for(int pos=0;pos<size;pos++) if(isGood[pos]) output[pos] += coeffs[pos];
273    for(int pos=0;pos<size;pos++) residual[pos] = input[pos] - output[pos];
274    array = new float[size];
275    goodSize=0;
276    for(int i=0;i<size;i++) if(isGood[i]) array[goodSize++] = residual[i];
277    findMedianStats(array,goodSize,mean,newsigma);
278    delete [] array;
279    cerr<<"|"<<newsigma<<"|"<<fabsf(oldsigma-newsigma)/newsigma;
280
281  }while( fabsf(oldsigma-newsigma)/newsigma > reconTolerance);
282
283  delete [] coeffs;
284  delete [] wavelet;
285  delete [] residual;
286}
Note: See TracBrowser for help on using the repository browser.