diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2017-08-03 21:28:54 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2017-08-03 21:28:54 (GMT) |
commit | 127cdb259379f4a6a3ff269a4d48b7de6c9fa75f (patch) | |
tree | a4347b658d9379e27fb3bc4f30a3ea1d9d6aaf5a /tksao/util | |
parent | 88c931f321813357d1a52d6ecbc90f90476a38d5 (diff) | |
download | blt-127cdb259379f4a6a3ff269a4d48b7de6c9fa75f.zip blt-127cdb259379f4a6a3ff269a4d48b7de6c9fa75f.tar.gz blt-127cdb259379f4a6a3ff269a4d48b7de6c9fa75f.tar.bz2 |
add elliptical gaussian smooth
Diffstat (limited to 'tksao/util')
-rw-r--r-- | tksao/util/smooth.C | 97 | ||||
-rw-r--r-- | tksao/util/smooth.h | 7 |
2 files changed, 64 insertions, 40 deletions
diff --git a/tksao/util/smooth.C b/tksao/util/smooth.C index 4b7e49e..f87d9f2 100644 --- a/tksao/util/smooth.C +++ b/tksao/util/smooth.C @@ -11,76 +11,57 @@ using namespace std; #include "smooth.h" -void boxcar(double* kernel, int k, int r) -{ - if (r>k) - r=k; +static void dumpKernel(double* kernel, int k); +void boxcar(double* kernel, int k) +{ int kk = 2*k+1; - int ksz = kk*kk; + int kk2 = 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 ii=0; ii<kk2; ii++) + kernel[ii] /= kk2; - for (int yy=-k; yy<=k; yy++) - for (int xx=-k; xx<=k; xx++) - cerr << '(' << xx << ',' << yy << ")=" - << kernel[(yy+k)*kk+(xx+k)] << endl; + // dumpKernel(kernel, k); } -void tophat(double* kernel, int k, int r) +void tophat(double* kernel, int k) { - if (r>k) - r=k; - + int k2 = k*k; int kk = 2*k+1; - int ksz = kk*kk; - int rr = r*r; + int kk2 = kk*kk; int cnt =0; for (int yy=-k; yy<=k; yy++) for (int xx=-k; xx<=k; xx++) - if ((xx*xx + yy*yy) <= rr) { + if ((xx*xx + yy*yy)/k2 <= 1) { kernel[(yy+k)*kk+(xx+k)] = 1; cnt++; } // normalize kernel if (cnt) - for (int ii=0; ii<ksz; ii++) + for (int ii=0; ii<kk2; 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; + // dumpKernel(kernel, k); } -void gaussian(double* kernel, int k, int r) +void gaussian(double* kernel, int k, double ss) { - 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; + int kk2 = kk*kk; + double s2 = ss*ss; double total =0; for (int yy=-k; yy<=k; yy++) for (int xx=-k; xx<=k; xx++) - if ((xx*xx + yy*yy) <= k2) { + if ((xx*xx + yy*yy)/k2 <= 1) { double vv = exp(-.5*((xx*xx + yy*yy)/s2)); kernel[(yy+k)*kk+(xx+k)] = vv; total += vv; @@ -88,7 +69,49 @@ void gaussian(double* kernel, int k, int r) // normalize kernel if (total) - for (int ii=0; ii<ksz; ii++) + for (int ii=0; ii<kk2; ii++) kernel[ii] /= total; + + // dumpKernel(kernel, k); +} + +void elliptic(double* kernel, int k, int rm, double ss, double sm, double aa) +{ + int kk = 2*k+1; + int kk2 = kk*kk; + double s2 = ss*ss; + double sm2 = sm*sm; + + double a = cos(aa)*cos(aa)/(2*s2) + sin(aa)*sin(aa)/(2*sm2); + double b = -sin(2*aa)/(4*s2) + sin(2*aa)/(4*sm2); + double c = sin(aa)*sin(aa)/(2*s2) + cos(aa)*cos(aa)/(2*sm2); + + double tt =0; + for (int yy=-k; yy<=k; yy++) { + for (int xx=-k; xx<=k; xx++) { + double dd = xx*cos(aa)+yy*sin(aa); + double ee = xx*sin(aa)-yy*cos(aa); + if (dd*dd/(k*k) + ee*ee/(rm*rm)<= 1) { + double vv = exp(-(a*xx*xx + 2*b*xx*yy + c*yy*yy)); + kernel[(yy+k)*kk+(xx+k)] = vv; + tt += vv; + } + } + } + // normalize kernel + if (tt) + for (int ii=0; ii<kk2; ii++) + kernel[ii] /= tt; + + // dumpKernel(kernel, k); } +void dumpKernel(double* kernel, int k) +{ + int kk = 2*k+1; + + for (int yy=-k; yy<=k; yy++) + for (int xx=-k; xx<=k; xx++) + cerr << '(' << xx << ',' << yy << ")=" + << kernel[(yy+k)*kk+(xx+k)] << endl; +} diff --git a/tksao/util/smooth.h b/tksao/util/smooth.h index 0caf192..53e66dc 100644 --- a/tksao/util/smooth.h +++ b/tksao/util/smooth.h @@ -5,8 +5,9 @@ #ifndef __smooth_h__ #define __smooth_h__ -void boxcar(double* kernel, int k, int r); -void tophat(double* kernel, int k, int r); -void gaussian(double* kernel, int k, int r); +void boxcar(double* kernel, int r); +void tophat(double* kernel, int r); +void gaussian(double* kernel, int r, double sigma); +void elliptic(double* kernel, int r, int m, double ss, double sm, double aa); #endif |