8#include "tpcclibConfig.h"
23static char *info[] = {
24 "Estimate the dynamics in PET image by counting the numbers of frames where",
25 "pixel values are increasing or decreasing as compared to the previous frame.",
26 "An image containing number of increases minus number of decreases is saved.",
28 "Usage: @P [Options] imgfile dynimgfile",
31 " -dmi | -decr | -incr",
32 " Instead of the default operation, calculate the number of decreases",
33 " minus increases (-dmi), number of increases (-incr), or number of",
34 " decreases (-decr).",
36 " Negative numbers are set to zero.",
39 "See also: imgfrdif, imgledif, imgpeak, imgmask, imgthrs, img2tif",
41 "Keywords: image, dynamics, time, mask",
60int main(
int argc,
char **argv)
62 int ai, help=0, version=0, verbose=1;
63 char imgfile[FILENAME_MAX], outfile[FILENAME_MAX];
72 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
73 imgfile[0]=outfile[0]=(char)0;
75 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
76 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
78 if(strcasecmp(cptr,
"IMD")==0) {
80 }
else if(strcasecmp(cptr,
"DMI")==0) {
82 }
else if(strcasecmp(cptr,
"INCR")==0) {
84 }
else if(strcasecmp(cptr,
"DECR")==0) {
86 }
else if(strncasecmp(cptr,
"NONEGATIVES", 5)==0) {
87 workNegatives=1;
continue;
89 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
94 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
99 if(ai<argc) {
strlcpy(imgfile, argv[ai], FILENAME_MAX); ai++;}
100 if(ai<argc) {
strlcpy(outfile, argv[ai], FILENAME_MAX); ai++;}
101 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
105 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
111 printf(
"imgfile := %s\n", imgfile);
112 printf(
"outfile := %s\n", outfile);
113 printf(
"mode := %d\n", mode);
114 printf(
"workNegatives := %d\n", workNegatives);
122 if(verbose>0) {printf(
"reading dynamic image %s\n", imgfile); fflush(stdout);}
126 fprintf(stderr,
"Error: %s\n", img.
statmsg);
127 if(verbose>1) printf(
"ret := %d\n", ret);
131 fprintf(stderr,
"Error: %s contains only 1 time frame.\n", imgfile);
135 fprintf(stdout,
" image contains %d frames and %d planes.\n", img.
dimt, img.
dimz);
139 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
145 if(verbose>0) {printf(
"computing frame differences\n"); fflush(stdout);}
151 fprintf(stderr,
"Error: cannot compute frame differences.\n");
157 if(verbose>1) {printf(
"computing increases minus decreases\n"); fflush(stdout);}
158 for(
int zi=0; zi<dimg.
dimz; zi++)
159 for(
int yi=0; yi<dimg.
dimy; yi++)
160 for(
int xi=0; xi<dimg.
dimx; xi++)
161 iimg.
m[zi][yi][xi][0]-=dimg.
m[zi][yi][xi][0];
163 if(verbose>1) {printf(
"computing decreases minus increases\n"); fflush(stdout);}
164 for(
int zi=0; zi<dimg.
dimz; zi++)
165 for(
int yi=0; yi<dimg.
dimy; yi++)
166 for(
int xi=0; xi<dimg.
dimx; xi++)
167 iimg.
m[zi][yi][xi][0]=dimg.
m[zi][yi][xi][0]-iimg.
m[zi][yi][xi][0];
169 for(
int zi=0; zi<dimg.
dimz; zi++)
170 for(
int yi=0; yi<dimg.
dimy; yi++)
171 for(
int xi=0; xi<dimg.
dimx; xi++)
172 iimg.
m[zi][yi][xi][0]=dimg.
m[zi][yi][xi][0];
177 if(workNegatives==1)
imgCutoff(&iimg, 0.0, 1);
182 if(verbose>1) {printf(
"writing result image\n"); fflush(stdout);}
185 fprintf(stderr,
"Error: %s\n", iimg.
statmsg);
189 if(verbose>0) fprintf(stdout,
"Image %s saved.\n", outfile);
unsigned long long imgNaNs(IMG *img, int fix)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
int imgGetFrameDyn(IMG *img, IMG *iimg, IMG *dimg, int verbose)
void imgCutoff(IMG *image, float cutoff, int mode)
Header file for libtpcimgio.
Header file for libtpcimgp.
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
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)