8#include "tpcclibConfig.h"
25static char *info[] = {
26 "Delete specified planes (z dimension) from PET image in ECAT 6.3, 7.x,",
27 "NIfTI-1, or Analyze 7.5 format. If name for output file is not given,",
28 "then the original image is overwritten.",
30 "Usage: @P [Options] image planenr1 planenr2 [newimage]",
32 "Planes to be deleted can be given either as a range with planenr1",
33 "representing the first and planenr2 the last plane to delete (both >0),",
34 "or the number of planes to delete from the beginning and end (specified",
35 "with negative number or zero).",
39 " Planes are not actually deleted, but pixel values are set to zero.",
42 "Example 1: delete planes 2-3",
43 " @P a234dy1.v 2 3 a234dy1_wo2-3.v",
44 "Example 2: delete three first and two last planes",
45 " @P a234dy1.v -3 -2 a234dy1_4-13.v",
47 "See also: imgdelfr, imgdim, imgadd, esplit, imgslim, imgbox, imgzavg",
49 "Keywords: image, cropping, compression, time",
68int main(
int argc,
char **argv)
70 int ai, help=0, version=0, verbose=1;
72 char petfile[FILENAME_MAX], outfile[FILENAME_MAX];
73 int pstart=0, pstop=0;
80 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
81 petfile[0]=outfile[0]=(char)0;
83 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
85 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
86 if(strcasecmp(cptr,
"CROP")==0) {
88 }
else if(strcasecmp(cptr,
"ZERO")==0) {
91 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
96 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
101 if(ai<argc) {
strlcpy(petfile, argv[ai++], FILENAME_MAX);}
104 fprintf(stderr,
"Error: invalid cut start '%s'.\n", argv[ai]);
return(1);}
109 fprintf(stderr,
"Error: invalid cut stop '%s'.\n", argv[ai]);
return(1);}
112 if(ai<argc) {
strlcpy(outfile, argv[ai++], FILENAME_MAX);}
113 if(ai<argc) {fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
return(1);}
117 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
120 if(!outfile[0]) strcpy(outfile, petfile);
121 if(pstart>0 && pstop>=pstart) {
124 }
else if(pstart<=0 && pstop<=0 && (pstart<0 || pstop<0)) {
126 if(pstart<0) fstart=-pstart;
127 if(pstop<0) fend=-pstop;
130 fprintf(stderr,
"Error: invalid plane range.\n");
137 printf(
"petfile := %s\n", petfile);
138 printf(
"outfile := %s\n", outfile);
139 printf(
"doCrop := %d\n", doCrop);
141 printf(
"cut_start_plane := %d\n", pstart);
142 printf(
"cut_stop_plane := %d\n", pstop);
144 printf(
"cut_planes_from_beginning := %d\n", fstart);
145 printf(
"cut_planes_from_end := %d\n", fend);
154 if(verbose>0) fprintf(stdout,
"reading image %s\n", petfile);
156 if(
imgRead(petfile, &img)) {fprintf(stderr,
"Error: %s\n", img.
statmsg);
return(2);}
158 printf(
"dimx := %d\n", img.
dimx);
159 printf(
"dimy := %d\n", img.
dimy);
160 printf(
"dimz := %d\n", img.
dimz);
161 printf(
"dimt := %d\n", img.
dimt);
165 if(pstart>=0 && pstop>=img.
dimz) {
166 fprintf(stderr,
"Error: invalid plane range.\n");
169 if((fstart+fend)>=img.
dimz) {
170 fprintf(stderr,
"Error: all planes would be cropped.\n");
180 if(verbose>1) printf(
"setting selected pixel values to zero...\n");
182 for(
int zi=pstart; zi<=pstop; zi++)
183 for(
int yi=0; yi<img.
dimy; yi++)
184 for(
int xi=0; xi<img.
dimx; xi++)
185 for(
int fi=0; fi<img.
dimt; fi++)
186 img.
m[zi][yi][xi][fi]=0.0;
189 for(
int zi=0; zi<fstart; zi++)
190 for(
int yi=0; yi<img.
dimy; yi++)
191 for(
int xi=0; xi<img.
dimx; xi++)
192 for(
int fi=0; fi<img.
dimt; fi++)
193 img.
m[zi][yi][xi][fi]=0.0;
196 for(
int zi=img.
dimz-fend; zi<img.
dimz; zi++)
197 for(
int yi=0; yi<img.
dimy; yi++)
198 for(
int xi=0; xi<img.
dimx; xi++)
199 for(
int fi=0; fi<img.
dimt; fi++)
200 img.
m[zi][yi][xi][fi]=0.0;
202 if(verbose>1) fprintf(stdout,
"writing image...\n");
204 fprintf(stderr,
"Error: %s\n", img.
statmsg);
207 if(verbose>0) fprintf(stdout,
"%s written.\n", outfile);
217 if(verbose>1) printf(
"deleting selected planes...\n");
220 if(pstart>=0) planeNr=img.
dimz-(1+pstop-pstart);
else planeNr=img.
dimz-fstart-fend;
222 fprintf(stderr,
"Error: all planes would be cropped.\n");
225 if(verbose>2) fprintf(stdout,
"allocating memory for %d plane(s)\n", planeNr);
228 fprintf(stderr,
"Error: cannot allocate memory for new image.\n");
232 if(verbose>2) fprintf(stdout,
"copying data\n");
235 for(
int zi=0; zi<pstart; zi++, zj++) {
236 for(
int yi=0; yi<img.
dimy; yi++)
237 for(
int xi=0; xi<img.
dimx; xi++)
238 for(
int fi=0; fi<img.
dimt; fi++)
239 out.
m[zj][yi][xi][fi]=img.
m[zi][yi][xi][fi];
241 for(
int zi=pstop+1; zi<img.
dimz; zi++, zj++) {
242 for(
int yi=0; yi<img.
dimy; yi++)
243 for(
int xi=0; xi<img.
dimx; xi++)
244 for(
int fi=0; fi<img.
dimt; fi++)
245 out.
m[zj][yi][xi][fi]=img.
m[zi][yi][xi][fi];
249 for(
int zi=fstart; zi<img.
dimz-fend; zi++, zj++) {
250 for(
int yi=0; yi<img.
dimy; yi++)
251 for(
int xi=0; xi<img.
dimx; xi++)
252 for(
int fi=0; fi<img.
dimt; fi++)
253 out.
m[zj][yi][xi][fi]=img.
m[zi][yi][xi][fi];
259 if(verbose>1) fprintf(stdout,
"writing cropped image...\n");
261 fprintf(stderr,
"Error: %s\n", out.
statmsg);
264 if(verbose>0) fprintf(stdout,
"%s written.\n", outfile);
int atoi_with_check(const char *int_as_string, int *result_value)
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.