8#include "tpcclibConfig.h"
23static char *info[] = {
24 "Extract a box-like volume of 3D/4D PET image in ECAT format.",
25 "NIfTI-1 format is supported, except that SIF is not written.",
26 "Image is processed frame-by-frame, thus even large files can be processed.",
27 "Note that no backup is made of any previous output file.",
29 "Usage: @P [Options] imgfile [vrdfile outputfile]",
33 " Image is not cropped, but voxels outside of the given volume are",
37 "Volume range definition (vrd) file is an ASCII text file, which containts",
38 "pixel coordinates (x y z; 1..dimension) of the two opposite corners of",
39 "the cropped image volume, for example:",
40 " corner1 := 63 57 26",
41 " corner2 := 84 71 44",
42 "If only input image filename is given, then program prints the image",
45 "See also: imgdim, imgslim, esplit, e7vplavg, imgshrink, pxl2tac, imgdelfr",
47 "Keywords: image, cropping, mask, compression, tool",
66int main(
int argc,
char **argv)
68 int ai, help=0, version=0, verbose=1;
70 int ret, fi=0, xi, yi, zi, ti;
71 int newdimx, newdimy, newdimz;
72 char imgfile[FILENAME_MAX], outfile[FILENAME_MAX], vrdfile[FILENAME_MAX],
73 *cptr, temp[FILENAME_MAX];
74 IMG test_img, img, outimg;
81 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
82 imgfile[0]=outfile[0]=vrdfile[0]=(char)0;
84 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
85 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
87 if(strcasecmp(cptr,
"CROP")==0) {
89 }
else if(strcasecmp(cptr,
"ZERO")==0) {
92 fprintf(stderr,
"Error: unknown option '%s'.\n", argv[ai]);
97 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
102 if(ai<argc) {
strlcpy(imgfile, argv[ai], FILENAME_MAX); ai++;}
103 if(ai<argc) {
strlcpy(vrdfile, argv[ai], FILENAME_MAX); ai++;}
104 if(ai<argc) {
strlcpy(outfile, argv[ai], FILENAME_MAX); ai++;}
105 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
108 if(!imgfile[0] || (vrdfile[0] && !outfile[0])) {
109 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
116 printf(
"imgfile := %s\n", imgfile);
117 if(outfile[0]) printf(
"outfile := %s\n", outfile);
118 if(vrdfile[0]) printf(
"vrdfile := %s\n", vrdfile);
119 printf(
"doCrop := %d\n", doCrop);
127 if(verbose>1) printf(
"reading header from %s\n", imgfile);
131 fprintf(stderr,
"Error: %s\n", test_img.
statmsg);
134 if(verbose>20)
imgInfo(&test_img);
139 if(verbose>0 || !vrdfile[0]) {
140 fprintf(stdout,
"image_dimensions := %d %d %d\n",
142 fprintf(stdout,
"frame_nr := %d\n", test_img.
dimt);
148 if(!vrdfile[0]) {
imgEmpty(&test_img);
return(0);}
154 ret=
vrdRead(vrdfile, &vol_range, temp);
156 fprintf(stderr,
"Error in reading %s: %s\n", vrdfile, temp);
160 printf(
"volume_range.x := %d - %d\n", vol_range.
x1, vol_range.
x2);
161 printf(
"vol_range.y := %d - %d\n", vol_range.
y1, vol_range.
y2);
162 printf(
"vol_range.z := %d - %d\n", vol_range.
z1, vol_range.
z2);
165 if(vol_range.
x1<1 || vol_range.
x2>test_img.
dimx) {
166 fprintf(stderr,
"Error: invalid x range.\n");
169 if(vol_range.
y1<1 || vol_range.
y2>test_img.
dimy) {
170 fprintf(stderr,
"Error: invalid y range.\n");
173 if(vol_range.
z1<1 || vol_range.
z2>test_img.
dimz) {
174 fprintf(stderr,
"Error: invalid z range.\n");
179 newdimx=1+vol_range.
x2-vol_range.
x1;
180 newdimy=1+vol_range.
y2-vol_range.
y1;
181 newdimz=1+vol_range.
z2-vol_range.
z1;
182 if(verbose>0 && doCrop!=0) {
183 printf(
" new_dimx := %d\n", newdimx);
184 printf(
" new_dimy := %d\n", newdimy);
185 printf(
" new_dimz := %d\n", newdimz);
188 if(newdimx==test_img.
dimx && newdimy==test_img.
dimy && newdimz==test_img.
dimz)
190 fprintf(stderr,
"Error: whole image is included\n");
195 if(access(outfile, 0)!=-1 && remove(outfile)!=0) {
196 fprintf(stderr,
"Error: cannot overwrite %s\n", outfile);
209 printf(
"cropping selected volume from %s to %s\n", imgfile, outfile);
211 for(ti=0; ti<test_img.
dimt; ti++) {
212 if(verbose>2) printf(
" frame %d\n", ti+1);
216 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
222 if(verbose>4) printf(
" creating output IMG\n");
225 if(verbose>4) printf(
" copying header\n");
229 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
234 if(verbose>3) printf(
" copying pixel data\n");
236 for(zi=vol_range.
z1-1, nzi=0; zi<=vol_range.
z2-1; zi++, nzi++) {
237 for(yi=vol_range.
y1-1, nyi=0; yi<=vol_range.
y2-1; yi++, nyi++) {
238 for(xi=vol_range.
x1-1, nxi=0; xi<=vol_range.
x2-1; xi++, nxi++) {
239 if(verbose>10) printf(
" img1[%d][%d][%d]=%g -> img2[%d][%d][%d]\n",
240 zi, yi, xi, img.
m[zi][yi][xi][0], nxi, nyi, nxi);
241 outimg.
m[nzi][nyi][nxi][0]=img.
m[zi][yi][xi][0];
246 if(verbose>3) printf(
" writing frame %d\n", fi+1);
256 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
257 if(verbose>18)
imgInfo(&outimg);
261 if(verbose>2) printf(
" frame written.\n");
266 if(verbose>0) printf(
"Specified image volume written in %s\n", outfile);
276 printf(
"masking voxels outside selected volume from %s to %s\n", imgfile, outfile);
278 for(ti=0; ti<test_img.
dimt; ti++) {
279 if(verbose>2) printf(
" frame %d\n", ti+1);
283 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
288 if(verbose>3) printf(
" editing pixel data\n");
289 for(zi=0; zi<img.
dimz; zi++)
290 for(yi=0; yi<img.
dimy; yi++)
291 for(xi=0; xi<img.
dimx; xi++) {
292 if(zi<vol_range.z1-1 || zi>vol_range.
z2-1) {
293 img.
m[zi][yi][xi][0]=0.0;
continue;}
294 if(yi<vol_range.y1-1 || yi>vol_range.
y2-1) {
295 img.
m[zi][yi][xi][0]=0.0;
continue;}
296 if(xi<vol_range.x1-1 || xi>vol_range.
x2-1) {
297 img.
m[zi][yi][xi][0]=0.0;
continue;}
300 if(verbose>3) printf(
" writing frame %d\n", fi+1);
303 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
307 if(verbose>2) printf(
" frame written.\n");
312 if(verbose>0) printf(
"Masked image written in %s\n", outfile);
char * imgStatus(int status_index)
int imgCopyhdr(IMG *image1, IMG *image2)
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
void imgEmpty(IMG *image)
int imgWriteFrame(const char *fname, int frame_to_write, IMG *img, int frame_index)
int imgReadFrame(const char *fname, int frame_to_read, IMG *img, int frame_index)
int imgReadHeader(const char *fname, IMG *img, int format)
Header file for libtpcimgio.
int vrdRead(char *vdffile, VOL_RANGE *vol_range, char *status)
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)