8#include "tpcclibConfig.h"
29static char *info[] = {
30 "Find the position of maximum pixel value in PET image in ECAT 6.3 or 7.x,",
31 "NIfTI-1, or Analyze 7.5 format.",
32 "Position of the found pixel is written in specified file or stdout as its",
33 "coordinates (x,y,z,f; 1..dimension).",
35 "Usage: @P [Options] imgfile [pxlfile]",
39 " Find minimum instead of maximum.",
40 " -vrdfile=<filename>",
41 " Volume range definition (vrd) file is an ASCII text file, which",
42 " contains pixel coordinates (x y z f; 1..dimension) of the two opposite",
43 " corners of the image space to be searched for; for example:",
44 " corner1 := 63 57 26 1",
45 " corner2 := 84 71 44 17",
47 " Find pixel value weighted position inside the image.",
50 "See also: imgmax, imgpeak, imginteg, pxl2tac, pxl2mask, imgprofi, imgmask",
52 "Keywords: image, pixel, max, min",
71int main(
int argc,
char **argv)
73 int ai, help=0, version=0, verbose=1;
76 char imgfile[FILENAME_MAX], pxlfile[FILENAME_MAX], vrdfile[FILENAME_MAX];
83 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
84 imgfile[0]=pxlfile[0]=vrdfile[0]=(char)0;
87 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
88 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
90 if(strncasecmp(cptr,
"VRDFILE=", 8)==0) {
91 strlcpy(vrdfile, cptr+8, FILENAME_MAX);
if(vrdfile[0])
continue;
92 }
else if(strncasecmp(cptr,
"MINIMUM", 3)==0) {
93 find_what=1;
continue;
94 }
else if(strncasecmp(cptr,
"MAXIMUM", 3)==0) {
95 find_what=0;
continue;
96 }
else if(strncasecmp(cptr,
"WMAX", 1)==0) {
97 find_what=2;
continue;
99 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
104 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
109 if(ai<argc) {
strlcpy(imgfile, argv[ai], FILENAME_MAX); ai++;}
110 if(ai<argc) {
strlcpy(pxlfile, argv[ai], FILENAME_MAX); ai++;}
111 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
115 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
122 printf(
"imgfile := %s\n", imgfile);
123 if(vrdfile[0]) printf(
"vrdfile := %s\n", vrdfile);
124 if(pxlfile[0]) printf(
"pxlfile := %s\n", pxlfile);
125 printf(
"find_what := %d\n", find_what);
137 if(verbose>0) printf(
"reading %s\n", imgfile);
140 fprintf(stderr,
"Error: %s\n", img.
statmsg);
141 if(verbose>1) printf(
"ret=%d\n", ret);
145 printf(
"img_dimx := %d\n", img.
dimx);
146 printf(
"img_dimy := %d\n", img.
dimy);
147 printf(
"img_dimz := %d\n", img.
dimz);
148 printf(
"img_dimt := %d\n", img.
dimt);
151 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
154 if(verbose>0) fprintf(stdout,
"correcting sinogram data for decay\n");
157 fprintf(stderr,
"Error %d: cannot decay correct dynamic sinogram.\n", ret);
158 if(ret==1) fprintf(stderr,
" Sinogram contains no isotope.\n");
159 if(ret==2) fprintf(stderr,
" Sinogram is already decay corrected.\n");
166 if(verbose>0) fprintf(stdout,
"correcting sinogram data for frame lengths\n");
169 fprintf(stderr,
"Error: cannot correct sinogram counts.\n");
170 if(verbose>1) printf(
"ret=%d\n", ret);
182 if(verbose==1) printf(
"reading image volume range definition file\n");
183 if(verbose>1) printf(
"reading %s\n", vrdfile);
185 ret=
irdRead(vrdfile, &img_range, tmp);
187 fprintf(stderr,
"Error: could not read image range.\n");
188 if(verbose>2) printf(
"ret := %d\n", ret);
192 printf(
"img_range.x := %d - %d\n", img_range.
x1, img_range.
x2);
193 printf(
"img_range.y := %d - %d\n", img_range.
y1, img_range.
y2);
194 printf(
"img_range.z := %d - %d\n", img_range.
z1, img_range.
z2);
195 printf(
"img_range.f := %d - %d\n", img_range.
f1, img_range.
f2);
202 fprintf(stderr,
"Error: invalid image range.\n");
203 if(verbose>2) printf(
"ret := %d\n", ret);
215 if(verbose>0) printf(
"searching for max in %s\n", imgfile);
216 if(vrdfile[0]) ret=
imgRangeMinMax(&img, &img_range, &maxp, &maxv, &minp, &minv);
218 }
else if(find_what==1) {
219 if(verbose>0) printf(
"searching for min in %s\n", imgfile);
220 if(vrdfile[0]) ret=
imgRangeMinMax(&img, &img_range, &maxp, &maxv, &minp, &minv);
223 if(verbose>0) printf(
"searching for weighted max in %s\n", imgfile);
228 fprintf(stderr,
"Error: cannot find min/max in %s\n", imgfile);
229 if(verbose>1) printf(
"ret=%d\n", ret);
232 if(find_what!=2 && verbose>1) {
233 printf(
"image_min := %g\n", minv);
234 printf(
"image_max := %g\n", maxv);
243 if(find_what==0 || find_what==2) ip=&maxp;
else ip=&minp;
245 fprintf(stdout,
"%d,%d,%d,%d\n", ip->
x, ip->
y, ip->
z, ip->
f);
248 FILE *fp; fp=fopen(pxlfile,
"w");
250 fprintf(stderr,
"Error: cannot open file for writing (%s).\n", pxlfile);
253 fprintf(fp,
"%d,%d,%d,%d\n", ip->
x, ip->
y, ip->
z, ip->
f);
256 fprintf(stderr,
"Error: cannot write in file %s.\n", pxlfile);
259 if(verbose>0) printf(
"Pixel coordinates written in %s\n", pxlfile);
280 double wsum, wz, wy, wx, wf;
284 if(maxp==NULL)
return(1);
285 wsum=wz=wy=wx=wf=0.0;
288 if(r->
z1<1 || r->
y1<1 || r->
x1<1 || r->
f1<1)
return(2);
292 maxp->
z=r->
z1; maxp->
y=r->
y1; maxp->
x=r->
x1; maxp->
f=r->
f1;
293 for(zi=r->
z1-1; zi<r->z2; zi++) {
294 for(yi=r->
y1-1; yi<r->y2; yi++) {
295 for(xi=r->
x1-1; xi<r->x2; xi++) {
296 for(fi=r->
f1-1; fi<r->f2; fi++) {
297 wsum+=img->
m[zi][yi][xi][fi];
298 wx+=(double)xi*img->
m[zi][yi][xi][fi];
299 wy+=(double)yi*img->
m[zi][yi][xi][fi];
300 wz+=(double)zi*img->
m[zi][yi][xi][fi];
301 wf+=(double)fi*img->
m[zi][yi][xi][fi];
307 maxp->
x=maxp->
y=maxp->
z=maxp->
f=1;
308 for(zi=0; zi<img->
dimz; zi++) {
309 for(yi=0; yi<img->
dimy; yi++) {
310 for(xi=0; xi<img->
dimx; xi++) {
311 for(fi=0; fi<img->
dimt; fi++) {
312 wsum+=img->
m[zi][yi][xi][fi];
313 wx+=(double)xi*img->
m[zi][yi][xi][fi];
314 wy+=(double)yi*img->
m[zi][yi][xi][fi];
315 wz+=(double)zi*img->
m[zi][yi][xi][fi];
316 wf+=(double)fi*img->
m[zi][yi][xi][fi];
322 if(wsum<1.0E-08)
return(5);
323 wx/=wsum; wy/=wsum; wz/=wsum; wf/=wsum;
324 maxp->
x=1+(int)roundf(wx); maxp->
y=1+(int)roundf(wy);
325 maxp->
z=1+(int)roundf(wz); maxp->
f=1+(int)roundf(wf);
unsigned long long imgNaNs(IMG *img, int fix)
void imgEmpty(IMG *image)
int imgRawCountsPerTime(IMG *img, int operation)
int imgDecayCorrection(IMG *image, int mode)
int imgRead(const char *fname, IMG *img)
int imgRangeWeightedMax(IMG *img, IMG_RANGE *r, IMG_PIXEL *maxp)
int imgRangeMinMax(IMG *img, IMG_RANGE *r, IMG_PIXEL *maxp, float *maxv, IMG_PIXEL *minp, float *minv)
int irdRead(char *irdfile, IMG_RANGE *img_range, char *status)
int irdCheck(IMG_RANGE *r, IMG *img)
Header file for libtpcimgio.
#define IMG_STATUS_OCCUPIED
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)