8#include "tpcclibConfig.h"
25static char *info[] = {
26 "Delete specified frames from PET image in ECAT 6.3, 7.x, NIfTI-1, or",
27 "Analyze 7.5 format.",
28 "Analyze and NIfTI image must have the SIF in the same folder.",
30 "Usage: @P [Options] image startframe endframe newimage",
34 " Frames are not actually deleted, but pixel values are set to zero.",
36 " Start and end times (in sec) are given instead of frame numbers.",
38 " Start and end times (in min) are given instead of frame numbers.",
41 "See also: esplit, ecatcat, eframe, ecattime, imgbox, imgdelpl, imgdim",
43 "Keywords: image, cropping, compression, time",
62int main(
int argc,
char **argv)
64 int ai, help=0, version=0, verbose=1;
67 char petfile[FILENAME_MAX], outfile[FILENAME_MAX];
77 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
78 petfile[0]=outfile[0]=(char)0;
80 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
82 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
83 if(strcasecmp(cptr,
"CROP")==0) {
85 }
else if(strcasecmp(cptr,
"ZERO")==0) {
87 }
else if(strncasecmp(cptr,
"SECONDS", 3)==0) {
89 }
else if(strncasecmp(cptr,
"MINUTES", 3)==0) {
92 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
97 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
102 if(ai<argc) {
strlcpy(petfile, argv[ai++], FILENAME_MAX);}
107 if(ret!=0) {fprintf(stderr,
"Error: invalid cut start '%s'.\n", argv[ai]);
return(1);}
114 if(ret!=0) {fprintf(stderr,
"Error: invalid cut stop '%s'.\n", argv[ai]);
return(1);}
117 if(ai<argc) {
strlcpy(outfile, argv[ai++], FILENAME_MAX);}
119 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
125 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
128 if(times<0 && fstart>fstop) {
129 fprintf(stderr,
"Error: invalid frame number range.\n");
132 if(times>=0 && tstart>=tstop) {
133 fprintf(stderr,
"Error: invalid frame time range.\n");
136 if(strcasecmp(outfile, petfile)==0) {
137 fprintf(stderr,
"Error: check the output filename.\n");
144 printf(
"petfile := %s\n", petfile);
145 printf(
"outfile := %s\n", outfile);
146 printf(
"doCrop := %d\n", doCrop);
148 printf(
"cut_start_frame := %d\n", fstart);
149 printf(
"cut_stop_frame := %d\n", fstop);
151 printf(
"cut_start_time_in_sec := %g\n", tstart);
152 printf(
"cut_stop_time_in_sec := %g\n", tstop);
161 if(verbose>0) fprintf(stdout,
"reading image %s\n", petfile);
165 fprintf(stderr,
"Error: %s\n", img.
statmsg);
if(verbose>1)
imgInfo(&img);
171 fprintf(stderr,
"Error: image does not contain frame times.\n");
177 if(verbose>1) printf(
"PET time range: %g - %g s\n", img.
start[0], img.
end[img.
dimt-1]);
179 for(
int fi=0; fi<img.
dimt; fi++)
if(img.
mid[fi]>=tstart) {fstart=fi;
break;}
180 for(
int fi=img.
dimt-1; fi>=0; fi--)
if(img.
mid[fi]<=tstop) {fstop=fi;
break;}
181 if(fstart<0 || fstop<0) {
182 fprintf(stderr,
"Error: invalid time range.\n");
186 printf(
"cut_start_frame := %d\n", 1+fstart);
187 printf(
"cut_stop_frame := %d\n", 1+fstop);
192 if(fstart<1) fstart=1;
196 if(fstart>fstop || fstart>=img.
dimt || fstop<0) {
197 fprintf(stderr,
"Error: invalid frame time range.\n");
201 printf(
"Selected PET time range: %g - %g s\n", img.
start[fstart], img.
end[fstop]);
210 if(verbose>1) printf(
"setting selected pixel values to zero...\n");
212 for(fi=fstart; fi<=fstop; fi++)
213 for(zi=0; zi<img.
dimz; zi++)
214 for(yi=0; yi<img.
dimy; yi++)
215 for(xi=0; xi<img.
dimx; xi++)
216 img.
m[zi][yi][xi][fi]=0.0;
217 if(verbose>1) fprintf(stdout,
"writing image...\n");
220 fprintf(stderr,
"Error: %s\n", img.
statmsg);
223 if(verbose>0) fprintf(stdout,
"%s written.\n", outfile);
233 if(verbose>1) printf(
"deleting selected frames...\n");
235 int frameNr=img.
dimt-(1+fstop-fstart);
237 fprintf(stderr,
"Error: all frames would be cropped.\n");
241 if(verbose>2) fprintf(stdout,
"allocating memory\n");
245 fprintf(stderr,
"Error: cannot allocate memory for new image.\n");
250 if(verbose>2) fprintf(stdout,
"copying data\n");
251 int fi, fj=0, zi, yi, xi;
252 for(fi=0; fi<fstart; fi++, fj++) {
253 for(zi=0; zi<img.
dimz; zi++)
254 for(yi=0; yi<img.
dimy; yi++)
255 for(xi=0; xi<img.
dimx; xi++)
256 out.
m[zi][yi][xi][fj]=img.
m[zi][yi][xi][fi];
261 for(fi=fstop+1; fi<img.
dimt; fi++, fj++) {
262 for(zi=0; zi<img.
dimz; zi++)
263 for(yi=0; yi<img.
dimy; yi++)
264 for(xi=0; xi<img.
dimx; xi++)
265 out.
m[zi][yi][xi][fj]=img.
m[zi][yi][xi][fi];
271 if(verbose>1) fprintf(stdout,
"writing cropped image...\n");
274 fprintf(stderr,
"Error: %s\n", out.
statmsg);
277 if(verbose>0) fprintf(stdout,
"%s written.\n", outfile);
int atof_with_check(char *double_as_string, double *result_value)
int atoi_with_check(const char *int_as_string, int *result_value)
int imgExistentTimes(IMG *img)
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
Header file for libtpccurveio.
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)
Header file for libtpcmodel.