8#include "tpcclibConfig.h"
24static char *info[] = {
25 "Make a map of standard deviation across image frames.",
27 "Usage: @P [options] imgfile sdmap",
31 " Calculate mean/SD map instead of SD map.",
33 " Calculate mean-SD map instead of SD map.",
36 "See also: fvar4img, imginteg, imgfiltg, imgdysmo",
38 "Keywords: image, noise",
57int main(
int argc,
char **argv)
59 int ai, help=0, version=0, verbose=1;
61 char imgfile[FILENAME_MAX], mapfile[FILENAME_MAX];
68 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
69 imgfile[0]=mapfile[0]=(char)0;
71 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
73 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
74 if(strcasecmp(cptr,
"SNR")==0) {
76 }
else if(strcasecmp(cptr,
"SD")==0 || strcasecmp(cptr,
"STD")==0) {
78 }
else if(strcasecmp(cptr,
"DIF")==0) {
81 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
86 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
91 if(ai<argc)
strlcpy(imgfile, argv[ai++], FILENAME_MAX);
92 if(ai<argc)
strlcpy(mapfile, argv[ai++], FILENAME_MAX);
93 if(ai<argc) {fprintf(stderr,
"Error: too many arguments: '%s'.\n", argv[ai]);
return(1);}
95 if(!mapfile[0]) {
tpcPrintUsage(argv[0], info, stdout);
return(1);}
99 printf(
"imgfile := %s\n", imgfile);
100 printf(
"mapfile := %s\n", mapfile);
101 printf(
"mode := %d\n", mode);
114 if(verbose>1) {printf(
"reading %s\n", imgfile); fflush(stdout);}
116 ret=
imgRead(&img, imgfile, &status);
118 fprintf(stderr,
"Error: %s (%s)\n",
errorMsg(status.
error), imgfile); fflush(stderr);
123 fprintf(stderr,
"Error: method is not applicable to static image.\n"); fflush(stderr);
127 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
133 if(verbose>1) {printf(
"preparing SD map\n"); fflush(stdout);}
136 fprintf(stderr,
"Error: invalid sample times in %s\n", imgfile); fflush(stderr);
146 if(verbose>0) {printf(
"processing %llu image pixels\n", pxlNr); fflush(stdout);}
147 for(
int zi=0; zi<img.
dimz; zi++) {
148 if(img.
dimz>2 && verbose>0) {fprintf(stdout,
"."); fflush(stdout);}
149 for(
int yi=0; yi<img.
dimy; yi++)
for(
int xi=0; xi<img.
dimx; xi++) {
150 map.
m[zi][yi][xi][0]=0.0;
154 map.
m[zi][yi][xi][0]=sd;
157 if(isnormal(snr)) map.
m[zi][yi][xi][0]=snr;
159 map.
m[zi][yi][xi][0]=mean-sd;
163 if(img.
dimz>2 && verbose>0) {fprintf(stdout,
"\n"); fflush(stdout);}
172 if(verbose>1) {printf(
"writing %s\n", mapfile); fflush(stdout);}
173 ret=
imgWrite(&map, mapfile, &status);
175 fprintf(stderr,
"Error: %s\n",
errorMsg(status.
error)); fflush(stderr);
179 if(verbose>0) {printf(
" %s written.\n", mapfile); fflush(stdout);}
void imgContents(IMG *img, FILE *fp)
unsigned long long imgNaNs(IMG *img, int fix)
int imgAllocate(IMG *img, const unsigned int dimz, const unsigned int dimy, const unsigned int dimx, const unsigned int dimt, TPCSTATUS *status)
int imgRead(IMG *img, const char *fname, TPCSTATUS *status)
int imgWrite(IMG *img, const char *fname, TPCSTATUS *status)
int fstatMeanSD(float *data, unsigned int n, float *mean, float *sd, unsigned int *vn)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpccsv.
Header file for library libtpcextensions.
Header file for library libtpcift.
Header file for libtpcimage.
Header file for libtpcstatist.
Header file for library libtpctac.