diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2017-08-02 19:36:03 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2017-08-02 19:36:03 (GMT) |
commit | 41a92bc71050c61e6978f9d1830fc59e8d734120 (patch) | |
tree | a1c02a14221e7e7530e2044b89ae7c6985d9ec7e /tksao/util | |
parent | 4920b5dcdfd14897ee44086e48e79591b7174bc5 (diff) | |
download | blt-41a92bc71050c61e6978f9d1830fc59e8d734120.zip blt-41a92bc71050c61e6978f9d1830fc59e8d734120.tar.gz blt-41a92bc71050c61e6978f9d1830fc59e8d734120.tar.bz2 |
SMOOTH: separated function radius parameter from kernel size parameter
Diffstat (limited to 'tksao/util')
-rw-r--r-- | tksao/util/smooth.C | 101 | ||||
-rw-r--r-- | tksao/util/smooth.h | 6 |
2 files changed, 67 insertions, 40 deletions
diff --git a/tksao/util/smooth.C b/tksao/util/smooth.C index 0f1435d..4b7e49e 100644 --- a/tksao/util/smooth.C +++ b/tksao/util/smooth.C @@ -11,57 +11,84 @@ using namespace std; #include "smooth.h" -void boxcar(double* kernel, int r) +void boxcar(double* kernel, int k, int r) { - int rr = 2*r+1; - int ksz = rr*rr; - - double* ptr = kernel; - for (int jj=0; jj<rr; jj++) - for (int ii=0; ii<rr; ii++, ptr++) - *ptr = 1./ksz; + if (r>k) + r=k; + + int kk = 2*k+1; + int ksz = kk*kk; + + int cnt =0; + for (int yy=-k; yy<=k; yy++) + for (int xx=-k; xx<=k; xx++) + if (abs(yy) <= r && abs(xx) <= r) { + kernel[(yy+k)*kk+(xx+k)] = 1; + cnt++; + } + + // normalize kernel + if (cnt) + for (int ii=0; ii<ksz; ii++) + kernel[ii] /= cnt; + + for (int yy=-k; yy<=k; yy++) + for (int xx=-k; xx<=k; xx++) + cerr << '(' << xx << ',' << yy << ")=" + << kernel[(yy+k)*kk+(xx+k)] << endl; } -void tophat(double* kernel, int r) +void tophat(double* kernel, int k, int r) { - int rr = 2*r+1; - int ksz = rr*rr; - - double kt = 0; - for (int y=-r; y<=r; y++) { - for (int x=-r; x<=r; x++) { - if ((x*x + y*y) <= r*r) { - kernel[(y+r)*rr+(x+r)] = 1; - kt++; + if (r>k) + r=k; + + int kk = 2*k+1; + int ksz = kk*kk; + int rr = r*r; + + int cnt =0; + for (int yy=-k; yy<=k; yy++) + for (int xx=-k; xx<=k; xx++) + if ((xx*xx + yy*yy) <= rr) { + kernel[(yy+k)*kk+(xx+k)] = 1; + cnt++; } - } - } // normalize kernel - for (int aa=0; aa<ksz; aa++) - kernel[aa] /= kt; + if (cnt) + for (int ii=0; ii<ksz; ii++) + kernel[ii] /= cnt; + + for (int yy=-k; yy<=k; yy++) + for (int xx=-k; xx<=k; xx++) + cerr << '(' << xx << ',' << yy << ")=" + << kernel[(yy+k)*kk+(xx+k)] << endl; } -void gaussian(double* kernel, int r) +void gaussian(double* kernel, int k, int r) { - int rr = 2*r+1; - int ksz = rr*rr; + if (r>k) + r=k; + + int k2 = k*k; + int kk = 2*k+1; + int ksz = kk*kk; double sigma = r/2.; double s2 = sigma*sigma; - - double kt = 0; - for (int y=-r; y<=r; y++) { - for (int x=-r; x<=r; x++) { - if ((x*x + y*y) <= r*r) { - double vv = exp(-.5*((x*x + y*y)/s2)); - kernel[(y+r)*rr+(x+r)] = vv; - kt += vv; + + double total =0; + for (int yy=-k; yy<=k; yy++) + for (int xx=-k; xx<=k; xx++) + if ((xx*xx + yy*yy) <= k2) { + double vv = exp(-.5*((xx*xx + yy*yy)/s2)); + kernel[(yy+k)*kk+(xx+k)] = vv; + total += vv; } - } - } // normalize kernel - for (int aa=0; aa<ksz; aa++) - kernel[aa] /= kt; + if (total) + for (int ii=0; ii<ksz; ii++) + kernel[ii] /= total; } diff --git a/tksao/util/smooth.h b/tksao/util/smooth.h index 7674fee..0caf192 100644 --- a/tksao/util/smooth.h +++ b/tksao/util/smooth.h @@ -5,8 +5,8 @@ #ifndef __smooth_h__ #define __smooth_h__ -void boxcar(double* kernel, int r); -void tophat(double* kernel, int r); -void gaussian(double* kernel, int r); +void boxcar(double* kernel, int k, int r); +void tophat(double* kernel, int k, int r); +void gaussian(double* kernel, int k, int r); #endif |