8#include "tpcclibConfig.h"
26static char *info[] = {
27 "Divide the voxel values in static PET image into quantiles.",
28 "PET image file must be in ECAT, NIfTI, or Analyze format.",
29 "User must specify the number of groups, and program writes the group",
30 "cut points (quantiles, nr of groups - 1) into stdout.",
32 "Usage: @P [Options] petfile groupnr",
36 " Include only voxels with value > 0.",
38 " Use absolute voxel values.",
41 "See also: imghist, imginteg, imgpeak, imgthrs, imgcutof, imgmask",
43 "Keywords: image, histogram, threshold",
60static int statFloatCompAsc(
const void *i,
const void *j)
62 const float *di = (
const float *)i;
63 const float *dj = (
const float *)j;
64 return(*di > *dj) - (*di < *dj);
66static int statFloatCompDesc(
const void *i,
const void *j)
68 const float *di = (
const float *)i;
69 const float *dj = (
const float *)j;
70 return(*di < *dj) - (*di > *dj);
84 if(n<2 || data==NULL)
return;
85 if(order==0) qsort(data, n,
sizeof(
float), statFloatCompAsc);
86 else qsort(data, n,
sizeof(
float), statFloatCompDesc);
95int main(
int argc,
char **argv)
97 int ai, help=0, version=0, verbose=1;
98 char petfile[FILENAME_MAX];
109 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
112 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
114 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
115 if(strncasecmp(cptr,
"POSITIVES", 3)==0) {
116 positives=1;
continue;
117 }
else if(strncasecmp(cptr,
"ABSOLUTES", 3)==0) {
118 absolutes=1;
continue;
120 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
125 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
130 if(ai<argc)
strlcpy(petfile, argv[ai++], FILENAME_MAX);
131 if(ai<argc) groupNr=atoi(argv[ai++]);
133 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
138 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
142 fprintf(stderr,
"Error: invalid nr of groups.\n");
145 if(absolutes && positives) {
146 fprintf(stderr,
"Error: invalid combination of options -abs and -pos.\n");
152 printf(
"petfile := %s\n", petfile);
153 printf(
"groupNr := %d\n", groupNr);
154 printf(
"positives_only := %d\n", positives);
155 printf(
"absolute_values := %d\n", absolutes);
164 if(verbose>0) fprintf(stdout,
"reading %s\n", petfile);
168 fprintf(stderr,
"Error: %s\n", img.
statmsg);
169 if(verbose>1) printf(
"ret=%d\n", ret);
173 printf(
"image_size := %d x %d x %d\n", img.
dimx, img.
dimy, img.
dimz);
174 if(img.
dimt>1) printf(
"frame_nr := %d\n", img.
dimt);
177 fprintf(stderr,
"Error: cannot process dynamic images.\n");
181 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
184 if(verbose>1) fprintf(stdout,
"copying voxel values\n");
186 float *pxls=(
float*)malloc(pxlNr*
sizeof(
float));
188 fprintf(stderr,
"Error: cannot allocate memory.\n");
192 for(
int zi=0; zi<img.
dimz; zi++)
193 for(
int yi=0; yi<img.
dimy; yi++)
194 for(
int xi=0; xi<img.
dimx; xi++) {
195 if(positives && img.
m[zi][yi][xi][0]<1.0E-010)
continue;
196 if(absolutes==0) pxls[pxlNr]=img.
m[zi][yi][xi][0];
197 else pxls[pxlNr]=fabsf(img.
m[zi][yi][xi][0]);
200 if(verbose>1) printf(
"included_pixel_nr := %lld\n", pxlNr);
202 if(positives) fprintf(stderr,
"Error: no positive voxel values.\n");
203 else fprintf(stderr,
"Error: more groups than voxels.\n");
211 if(verbose>0) fprintf(stdout,
"sorting voxel values\n");
215 int nrPerGroup=pxlNr/groupNr;
216 if(verbose>1) printf(
"pixels_per_group := %d\n", nrPerGroup);
217 float pxlQuantiles[groupNr-1];
218 for(
int i=1; i<groupNr; i++) {
219 pxlQuantiles[i-1]=0.5*(pxls[i*nrPerGroup]+pxls[i*nrPerGroup - 1]);
220 if(verbose>10) printf(
"quantile[%d] := %g\n", i, pxlQuantiles[i-1]);
227 for(
int i=1; i<groupNr; i++) {
228 fprintf(stdout,
"quantile[%d] := %g\n", i, pxlQuantiles[i-1]);
unsigned long long imgNaNs(IMG *img, int fix)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
void statSortFloat(float *data, unsigned int n, int order)
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 libtpcmodext.
Header file for libtpcsvg.