33 if(verbose>0) printf(
"%s(*img, %g, %g, %g, %g, %d)\n", __func__, xsd, ysd, zsd, tolerance, verbose);
35 if(img==NULL || img->
dimz<1 || img->
dimy<1 || img->
dimx<1 || img->
dimt<1)
return 1;
40 if(xsd>0.0 && (dimx<4 || !(img->
sizex>0.0)))
return(2);
41 if(ysd>0.0 && (dimy<4 || !(img->
sizey>0.0)))
return(3);
42 if(zsd>0.0 && (dimz<4 || !(img->
sizez>0.0)))
return(4);
43 if(!(xsd>0.0) && !(ysd>0.0) && !(zsd>0.0)) {
44 if(verbose>1) printf(
" no filtering done.\n");
47 if(!(tolerance>0.0)) tolerance=1.0E-03;
48 if(tolerance>=1.0)
return(5);
50 double sqrt_pi2=sqrt(M_PI)/M_SQRT2;
56 if(verbose>1) {printf(
" filtering in x dimension\n"); fflush(stdout);}
57 int r=ceil(M_SQRT2*xsd*
inverfc(0.5*tolerance));
59 double sdsqrt2=M_SQRT2*xsd;
62 for(
int i=1; i<=r; i++)
63 gtrunc[i]=sqrt_pi2*xsd*(erf(((
double)i+0.5)/sdsqrt2) - erf(((
double)i-0.5)/sdsqrt2));
64 double sum=gtrunc[0];
for(
int i=1; i<=r; i++) sum+=2.0*gtrunc[i];
65 for(
int i=0; i<=r; i++) gtrunc[i]/=sum;
66 if(verbose>2) printf(
" r=%d \n", r);
68 printf(
" gtrunc[]= %g", gtrunc[0]);
for(
int i=1; i<=r; i++) printf(
",%g", gtrunc[i]);
72 for(
int t=0; t<dimt; t++) {
73 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
74 for(
int z=0; z<dimz; z++)
for(
int y=0; y<dimy; y++) {
76 for(
int x=0; x<dimx; x++) a[x]=img->
m[z][y][x][t];
77 for(
int x=0; x<dimx; x++) {
78 double v=gtrunc[0]*a[x];
79 for(
int m=1; m<=r; m++)
92 if(verbose>1) {printf(
" filtering in y dimension\n"); fflush(stdout);}
93 int r=ceil(M_SQRT2*ysd*
inverfc(0.5*tolerance));
95 double sdsqrt2=M_SQRT2*ysd;
98 for(
int i=1; i<=r; i++)
99 gtrunc[i]=sqrt_pi2*ysd*(erf(((
double)i+0.5)/sdsqrt2) - erf(((
double)i-0.5)/sdsqrt2));
100 double sum=gtrunc[0];
for(
int i=1; i<=r; i++) sum+=2.0*gtrunc[i];
101 for(
int i=0; i<=r; i++) gtrunc[i]/=sum;
102 if(verbose>2) printf(
" r=%d \n", r);
104 printf(
" gtrunc[]= %g", gtrunc[0]);
for(
int i=1; i<=r; i++) printf(
",%g", gtrunc[i]);
108 for(
int t=0; t<dimt; t++) {
109 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
110 for(
int z=0; z<dimz; z++)
for(
int x=0; x<dimx; x++) {
112 for(
int y=0; y<dimy; y++) a[y]=img->
m[z][y][x][t];
113 for(
int y=0; y<dimy; y++) {
114 double v=gtrunc[0]*a[y];
115 for(
int m=1; m<=r; m++)
117 img->
m[z][y][x][t]=v;
128 if(verbose>1) {printf(
" filtering in z dimension\n"); fflush(stdout);}
129 int r=ceil(M_SQRT2*zsd*
inverfc(0.5*tolerance));
131 double sdsqrt2=M_SQRT2*zsd;
134 for(
int i=1; i<=r; i++)
135 gtrunc[i]=sqrt_pi2*zsd*(erf(((
double)i+0.5)/sdsqrt2) - erf(((
double)i-0.5)/sdsqrt2));
136 double sum=gtrunc[0];
for(
int i=1; i<=r; i++) sum+=2.0*gtrunc[i];
137 for(
int i=0; i<=r; i++) gtrunc[i]/=sum;
138 if(verbose>2) printf(
" r=%d \n", r);
140 printf(
" gtrunc[]= %g", gtrunc[0]);
for(
int i=1; i<=r; i++) printf(
",%g", gtrunc[i]);
144 for(
int t=0; t<dimt; t++) {
145 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
146 for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++) {
148 for(
int z=0; z<dimz; z++) a[z]=img->
m[z][y][x][t];
149 for(
int z=0; z<dimz; z++) {
150 double v=gtrunc[0]*a[z];
151 for(
int m=1; m<=r; m++)
153 img->
m[z][y][x][t]=v;
190 if(verbose>0) printf(
"%s(*img, %g, %g, %g, %d, %d)\n", __func__, xsd, ysd, zsd, passNr, verbose);
192 if(img==NULL || img->
dimz<1 || img->
dimy<1 || img->
dimx<1 || img->
dimt<1)
return 1;
197 if(xsd>0.0 && (dimx<4 || !(img->
sizex>0.0)))
return(2);
198 if(ysd>0.0 && (dimy<4 || !(img->
sizey>0.0)))
return(3);
199 if(zsd>0.0 && (dimz<4 || !(img->
sizez>0.0)))
return(4);
200 if(!(xsd>0.0) && !(ysd>0.0) && !(zsd>0.0)) {
201 if(verbose>1) printf(
" no filtering done.\n");
202 fflush(stdout);
return(0);
204 if(passNr<=0) passNr=4;
205 if(!(tolerance>0.0)) tolerance=1.0E-06;
212 if(verbose>1) {printf(
" filtering in x dimension\n"); fflush(stdout);}
215 double f=0.7818+(double)passNr;
216 q*= 1.0 + (0.3165*(double)passNr + 0.5695)/(f*f);
218 double lambda=(q*q)/(2.0*(
double)passNr);
219 double nu=(1.0 + 2.0*lambda - sqrt(1.0 + 4.0*lambda))/(2.0*lambda);
220 double scale=pow(nu/lambda, passNr);
221 int termNr=ceil(log((1.0-nu)*tolerance)/log(nu));
222 if(verbose>2) printf(
" nu=%g scale=%g termNr=%d\n", nu, scale, termNr);
224 for(
int t=0; t<dimt; t++) {
225 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
226 double sum1=0.0, sum2=0.0;
227 for(
int z=0; z<dimz; z++)
for(
int y=0; y<dimy; y++) {
229 for(
int x=0; x<dimx; x++) sum1+=d[x]=img->
m[z][y][x][t];
231 for(
int x=0; x<dimx; x++) sum2+=img->
m[z][y][x][t]=d[x];
234 if(verbose>1 && fabs(1.0-f)>1.0E-10) {
235 printf(
" frame %d: sum of voxels differs pre/post filtering %g/%g=%g\n", 1+t, sum1, sum2, f);
244 if(verbose>1) {printf(
" filtering in y dimension\n"); fflush(stdout);}
247 double f=0.7818+(double)passNr;
248 q*= 1.0 + (0.3165*(double)passNr + 0.5695)/(f*f);
250 double lambda=(q*q)/(2.0*(
double)passNr);
251 double nu=(1.0 + 2.0*lambda - sqrt(1.0 + 4.0*lambda))/(2.0*lambda);
252 double scale=pow(nu/lambda, passNr);
253 int termNr=ceil(log((1.0-nu)*tolerance)/log(nu));
254 if(verbose>2) printf(
" nu=%g scale=%g termNr=%d\n", nu, scale, termNr);
256 for(
int t=0; t<dimt; t++) {
257 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
258 double sum1=0.0, sum2=0.0;
259 for(
int z=0; z<dimz; z++)
for(
int x=0; x<dimx; x++) {
261 for(
int y=0; y<dimy; y++) sum1+=d[y]=img->
m[z][y][x][t];
263 for(
int y=0; y<dimy; y++) sum2+=img->
m[z][y][x][t]=d[y];
266 if(verbose>1 && fabs(1.0-f)>1.0E-10) {
267 printf(
" frame %d: sum of voxels differs pre/post filtering %g/%g=%g\n", 1+t, sum1, sum2, f);
276 if(verbose>1) {printf(
" filtering in z dimension\n"); fflush(stdout);}
279 double f=0.7818+(double)passNr;
280 q*= 1.0 + (0.3165*(double)passNr + 0.5695)/(f*f);
282 double lambda=(q*q)/(2.0*(
double)passNr);
283 double nu=(1.0 + 2.0*lambda - sqrt(1.0 + 4.0*lambda))/(2.0*lambda);
284 double scale=pow(nu/lambda, passNr);
285 int termNr=ceil(log((1.0-nu)*tolerance)/log(nu));
286 if(verbose>2) printf(
" nu=%g scale=%g termNr=%d\n", nu, scale, termNr);
288 for(
int t=0; t<dimt; t++) {
289 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
290 double sum1=0.0, sum2=0.0;
291 for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimy; x++) {
293 for(
int z=0; z<dimz; z++) sum1+=d[z]=img->
m[z][y][x][t];
295 for(
int z=0; z<dimz; z++) sum2+=img->
m[z][y][x][t]=d[z];
298 if(verbose>1 && fabs(1.0-f)>1.0E-10) {
299 printf(
" frame %d: sum of voxels differs pre/post filtering %g/%g=%g\n", 1+t, sum1, sum2, f);
423 if(verbose>0) printf(
"%s(*img, %g, %g, %g, %d, %d)\n", __func__, xsd, ysd, zsd, passNr, verbose);
425 if(img==NULL || img->
dimz<1 || img->
dimy<1 || img->
dimx<1 || img->
dimt<1)
return 1;
430 if(xsd>0.0 && (dimx<4 || !(img->
sizex>0.0)))
return(2);
431 if(ysd>0.0 && (dimy<4 || !(img->
sizey>0.0)))
return(3);
432 if(zsd>0.0 && (dimz<4 || !(img->
sizez>0.0)))
return(4);
433 if(!(xsd>0.0) && !(ysd>0.0) && !(zsd>0.0)) {
434 if(verbose>1) printf(
" no filtering done.\n");
437 if(passNr<=0) passNr=4;
444 if(verbose>1) {printf(
" filtering in x dimension\n"); fflush(stdout);}
446 double wob, wib, s2p=xsd*xsd/(double)passNr;
448 rib=0.5*sqrt(1.0 + 12.0*s2p) - 0.5;
449 if(verbose>3) printf(
" precise_r := %f\n", 0.5*sqrt(1.0+12.0*s2p));
451 double a=(2*rib+1)*(rib*(rib+1) - 3.0*s2p) / (6.0*(s2p - (rib+1)*(rib+1)));
453 wob = a/(2.0*(a+rib)+1.0);
456 if(verbose>2) {printf(
" rib=%d wob=%g wib=%g a=%g\n", rib, wob, wib, a); fflush(stdout);}
458 for(
int t=0; t<dimt; t++) {
459 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
460 double sum1=0.0, sum2=0.0;
461 for(
int z=0; z<dimz; z++)
for(
int y=0; y<dimy; y++) {
463 for(
int x=0; x<dimx; x++) sum1+=d[x]=img->
m[z][y][x][t];
465 for(
int x=0; x<dimx; x++) sum2+=img->
m[z][y][x][t]=d[x];
468 if(fabs(1.0-f)>1.0E-10) {
470 printf(
" frame %d: sum of voxels differs pre/post filtering %g/%g=%g\n", 1+t, sum1, sum2, f);
471 for(
int z=0; z<dimz; z++)
for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++)
472 img->
m[z][y][x][t]*=f;
481 if(verbose>1) {printf(
" filtering in y dimension\n"); fflush(stdout);}
483 double wob, wib, s2p=ysd*ysd/(double)passNr;
485 rib=0.5*sqrt(1.0 + 12.0*s2p) - 0.5;
487 double a=(2*rib+1)*(rib*(rib+1) - 3.0*s2p) / (6.0*(s2p - (rib+1)*(rib+1)));
489 wob = a/(2.0*(a+rib)+1);
492 if(verbose>2) {printf(
" rib=%d wob=%g wib=%g a=%g\n", rib, wob, wib, a); fflush(stdout);}
494 for(
int t=0; t<dimt; t++) {
495 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
496 double sum1=0.0, sum2=0.0;
497 for(
int z=0; z<dimz; z++)
for(
int x=0; x<dimx; x++) {
499 for(
int y=0; y<dimy; y++) sum1+=d[y]=img->
m[z][y][x][t];
501 for(
int y=0; y<dimy; y++) sum2+=img->
m[z][y][x][t]=d[y];
504 if(fabs(1.0-f)>1.0E-10) {
506 printf(
" frame %d: sum of voxels differs pre/post filtering %g/%g=%g\n", 1+t, sum1, sum2, f);
507 for(
int z=0; z<dimz; z++)
for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++)
508 img->
m[z][y][x][t]*=f;
517 if(verbose>1) {printf(
" filtering in z dimension\n"); fflush(stdout);}
519 double wob, wib, s2p=zsd*zsd/(double)passNr;
521 rib=0.5*sqrt(1.0 + 12.0*s2p) - 0.5;
523 double a=(2*rib+1)*(rib*(rib+1) - 3.0*s2p) / (6.0*(s2p - (rib+1)*(rib+1)));
525 wob = a/(2.0*(a+rib)+1);
528 if(verbose>2) {printf(
" rib=%d wob=%g wib=%g a=%g\n", rib, wob, wib, a); fflush(stdout);}
530 for(
int t=0; t<dimt; t++) {
531 if(verbose>5) {printf(
" frame %d\n", 1+t); fflush(stdout);}
532 double sum1=0.0, sum2=0.0;
533 for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++) {
535 for(
int z=0; z<dimz; z++) sum1+=d[z]=img->
m[z][y][x][t];
537 for(
int z=0; z<dimz; z++) sum2+=img->
m[z][y][x][t]=d[z];
540 if(fabs(1.0-f)>1.0E-10) {
542 printf(
" frame %d: sum of voxels differs pre/post filtering %g/%g=%g\n", 1+t, sum1, sum2, f);
543 for(
int z=0; z<dimz; z++)
for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++)
544 img->
m[z][y][x][t]*=f;
639 if(verbose>0) printf(
"%s(*img, %d, %d, %d, %d)\n", __func__, xn, yn, zn, verbose);
641 if(img==NULL || img->
dimz<1 || img->
dimy<1 || img->
dimx<1 || img->
dimt<1)
return(1);
647 if(!(xn>0) && !(yn>0) && !(zn>0) && !(tn>0)) {
648 if(verbose>1) printf(
" no filtering done.\n");
651 if((xn>0 && xn<3) || (yn>0 && yn<3) || (zn>0 && zn<3) || (tn>0 && tn<3)) {
652 if(verbose>1) printf(
" invalid pixel number.\n");
655 if((xn>0 && xn%2==0) || (yn>0 && yn%2==0) || (zn>0 && zn%2==0) || (tn>0 && tn%2==0)) {
656 if(verbose>1) printf(
" invalid pixel number.\n");
659 if((xn>0 && dimx<=xn) || (yn>0 && dimy<=yn) || (zn>0 && dimz<=zn) || (tn>0 && dimt<=tn)) {
660 if(verbose>1) printf(
" invalid pixel number.\n");
669 if(verbose>1) {printf(
" filtering in x dimension\n"); fflush(stdout);}
671 for(
int z=0; z<dimz; z++)
672 for(
int y=0; y<dimy; y++)
673 for(
int t=0; t<dimt; t++) {
674 for(
int x=0; x<dimx; x++) buf[x]=img->
m[z][y][x][t];
676 for(
int x=0; x<dimx; x++) img->
m[z][y][x][t]=buf[x];
684 if(verbose>1) {printf(
" filtering in y dimension\n"); fflush(stdout);}
686 for(
int z=0; z<dimz; z++)
687 for(
int x=0; x<dimx; x++)
688 for(
int t=0; t<dimt; t++) {
689 for(
int y=0; y<dimy; y++) buf[y]=img->
m[z][y][x][t];
691 for(
int y=0; y<dimy; y++) img->
m[z][y][x][t]=buf[y];
699 if(verbose>1) {printf(
" filtering in z dimension\n"); fflush(stdout);}
701 for(
int y=0; y<dimy; y++)
702 for(
int x=0; x<dimx; x++)
703 for(
int t=0; t<dimt; t++) {
704 for(
int z=0; z<dimz; z++) buf[z]=img->
m[z][y][x][t];
706 for(
int z=0; z<dimz; z++) img->
m[z][y][x][t]=buf[z];
714 if(verbose>1) {printf(
" filtering in t dimension\n"); fflush(stdout);}
716 for(
int z=0; z<dimz; z++)
717 for(
int y=0; y<dimy; y++)
718 for(
int x=0; x<dimx; x++) {
719 for(
int t=0; t<dimt; t++) buf[t]=img->
m[z][y][x][t];
721 for(
int t=0; t<dimt; t++) img->
m[z][y][x][t]=buf[t];