summaryrefslogtreecommitdiffstats
path: root/tksao/util
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2017-08-02 19:36:03 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2017-08-02 19:36:03 (GMT)
commit41a92bc71050c61e6978f9d1830fc59e8d734120 (patch)
treea1c02a14221e7e7530e2044b89ae7c6985d9ec7e /tksao/util
parent4920b5dcdfd14897ee44086e48e79591b7174bc5 (diff)
downloadblt-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.C101
-rw-r--r--tksao/util/smooth.h6
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