source: tags/release-0.9/ATrous/atrous_1d_reconstruct.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: 4.3 KB
Line 
1#include <iostream>
2#include <iomanip>
3#include <math.h>
4#include <ATrous/atrous.hh>
5#include <Utils/utils.hh>
6
7using std::endl;
8using std::setw;
9
10void atrous1DReconstruct(long &xdim, float *&input,float *&output, Param &par)
11{
12  extern Filter reconFilter;
13  const float SNR_THRESH=par.getAtrousCut();
14  const int MIN_SCALE=par.getMinScale();
15
16  bool flagBlank=par.getFlagBlankPix();
17  float blankPixValue = par.getBlankPixVal();
18  int numScales = reconFilter.getNumScales(xdim);
19  double *sigmaFactors = new double[numScales+1];
20  for(int i=0;i<=numScales;i++){
21    if(i<=reconFilter.maxFactor(1)) sigmaFactors[i] = reconFilter.sigmaFactor(1,i);
22    else sigmaFactors[i] = sigmaFactors[i-1] / sqrt(2.);
23  }
24
25  float mean,sigma,originalSigma,originalMean,oldsigma,newsigma;
26  bool *isGood = new bool[xdim];
27  for(int pos=0;pos<xdim;pos++) //isGood[pos] = (!flagBlank) || (input[pos]!=blankPixValue);
28    isGood[pos] = !par.isBlank(input[pos]);
29
30  float *coeffs = new float[xdim];
31  float *wavelet = new float[xdim];
32
33  for(int pos=0;pos<xdim;pos++) output[pos]=0.;
34
35  int filterHW = reconFilter.width()/2;
36  double *filter = new double[reconFilter.width()];
37  for(int i=0;i<reconFilter.width();i++) filter[i] = reconFilter.coeff(i);
38
39
40  // No trimming done in 1D case.
41
42  int iteration=0;
43  newsigma = 1.e9;
44  do{
45    if(par.isVerbose()) std::cout << "Iteration #"<<++iteration<<":             ";
46    // first, get the value of oldsigma and set it to the previous newsigma value
47    oldsigma = newsigma;
48    // all other times round, we are transforming the residual array
49    for(int i=0;i<xdim;i++)  coeffs[i] = input[i] - output[i];
50   
51    float *array = new float[xdim];
52    int goodSize=0;
53    for(int i=0;i<xdim;i++) if(isGood[i]) array[goodSize++] = input[i];
54    findMedianStats(array,goodSize,originalMean,originalSigma);
55    originalSigma /= correctionFactor; // correct from MADFM to sigma estimator.
56    delete [] array;
57
58    int spacing = 1;
59    for(int scale = 1; scale<=numScales; scale++){
60
61      if(par.isVerbose()) {
62        std::cout << "\b\b\b\b\b\b\b\b\b\b\b\bScale ";
63        std::cout << setw(2)<<scale<<" /"<<setw(2)<<numScales<<std::flush;
64      }
65
66      for(int xpos = 0; xpos<xdim; xpos++){
67            // loops over each pixel in the image
68        int pos = xpos;
69
70        wavelet[pos] = coeffs[pos];
71       
72        if(!isGood[pos] )  wavelet[pos] = 0.;
73        else{
74
75          for(int xoffset=-filterHW; xoffset<=filterHW; xoffset++){
76            int x = xpos + spacing*xoffset;
77            //if(x<0) x = -x;                 // boundary conditions are
78            //if(x>=xdim) x = 2*(xdim-1) - x; //    reflection.
79            //              if(x<xLim1) x = 2*xLim1 - x;      // boundary conditions are
80            //              if(x>xLim2) x = 2*xLim2 - x;      //    reflection.
81
82            while((x<0)||(x>=xdim)){
83              if(x<0) x = 0 - x;     
84              else if(x>=xdim) x = 2*(xdim-1) - x;     
85            }
86
87            int filterpos = (xoffset+filterHW);
88            int oldpos = x;
89
90            if(isGood[oldpos])
91              wavelet[pos] -= filter[filterpos]*coeffs[oldpos];
92             
93          } //-> end of xoffset loop
94        } //-> end of else{ ( from if(!isGood[pos])  )
95           
96      } //-> end of xpos loop
97
98      for(int pos=0;pos<xdim;pos++) coeffs[pos] = coeffs[pos] - wavelet[pos];
99
100      // Have found wavelet coeffs for this scale -- now threshold
101      if(scale>=MIN_SCALE){
102        array = new float[xdim];
103        goodSize=0;
104        for(int pos=0;pos<xdim;pos++) if(isGood[pos]) array[goodSize++] = wavelet[pos];
105        findMedianStats(array,goodSize,mean,sigma);
106        delete [] array;
107       
108        for(int pos=0;pos<xdim;pos++){
109          // preserve the Blank pixel values in the output.
110          if(!isGood[pos]) output[pos] = blankPixValue;
111          else if(fabs(wavelet[pos])>(mean+SNR_THRESH*originalSigma*sigmaFactors[scale]))
112            output[pos] += wavelet[pos];
113        }
114      }
115 
116      spacing *= 2;
117
118    } //-> end of scale loop
119
120    for(int pos=0;pos<xdim;pos++) if(isGood[pos]) output[pos] += coeffs[pos];
121
122    array = new float[xdim];
123    goodSize=0;
124    for(int i=0;i<xdim;i++) if(isGood[i]) array[goodSize++] = input[i] - output[i];
125    findNormalStats(array,goodSize,mean,newsigma);
126    delete [] array;
127
128    if(par.isVerbose())     std::cout << "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";
129
130  } while( (iteration==1) ||
131           (fabsf(oldsigma-newsigma)/newsigma > reconTolerance) );
132
133  if(par.isVerbose()) std::cout << "Completed "<<iteration<<" iterations. ";
134
135  delete [] coeffs;
136  delete [] wavelet;
137  delete [] isGood;
138  delete [] filter;
139  delete [] sigmaFactors;
140}
Note: See TracBrowser for help on using the repository browser.