9#include "tpcclibConfig.h"
24static char *info[] = {
25 "Trial program to find the location of abdominal aorta in dynamic PET image.",
27 "Usage: @P [Options] imgfile maskfile",
31 " Image containing possible peak pixels.",
34 "See also: eabaort, imgprofi, imgthrs, imgfsegm, imgzavg, imgmax, img2tif",
36 "Keywords: image, input, blood, aorta, mask",
55int main(
int argc,
char **argv)
57 int ai, help=0, version=0, verbose=1;
59 char *cptr, imgfile[FILENAME_MAX], maskfile[FILENAME_MAX];
60 char peakfile[FILENAME_MAX];
66 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
67 imgfile[0]=maskfile[0]=(char)0;
70 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
71 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
73 if(strncasecmp(cptr,
"PEAK=", 5)==0) {
74 strlcpy(peakfile, cptr+5, FILENAME_MAX);
continue;
76 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
81 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
86 if(ai<argc) {
strlcpy(imgfile, argv[ai], FILENAME_MAX); ai++;}
87 if(ai<argc) {
strlcpy(maskfile, argv[ai], FILENAME_MAX); ai++;}
88 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
92 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
98 printf(
"imgfile := %s\n", imgfile);
99 printf(
"maskfile := %s\n", maskfile);
100 if(peakfile[0]) printf(
"peakfile := %s\n", peakfile);
107 if(verbose>0) fprintf(stdout,
"reading dynamic image %s\n", imgfile);
111 fprintf(stderr,
"Error: %s\n", img.
statmsg);
112 if(verbose>1) printf(
"ret := %d\n", ret);
116 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
119 fprintf(stderr,
"Error: %s is not an image.\n", imgfile);
122 int dimt, dimz, dimy, dimx;
124 if(verbose>0) fprintf(stdout,
" dim[x,y,z,t] := %d, %d, %d, %d\n", dimx, dimy, dimz, dimt);
132 ret=
imgDup(&img, &xyfilt);
133 if(ret==0) ret=
imgDup(&img, &zfilt);
135 fprintf(stderr,
"Error: cannot setup IMG data.\n");
136 if(verbose>1) fprintf(stderr,
"ret := %d\n", ret);
142 fprintf(stderr,
"Error: cannot filter the image.\n");
143 if(verbose>1) fprintf(stderr,
"ret := %d\n", ret);
154 fprintf(stderr,
"Error: out of memory.\n");
158 for(
int z=0; z<dimz; z++)
159 for(
int y=0; y<dimy; y++)
160 for(
int x=0; x<dimx; x++) {
164 for(
int t=0; t<dimt; t++) {
165 if(xyfilt.
m[z][y][x][t]>maxv) {maxt=t; maxv=xyfilt.
m[z][y][x][t];}
167 peak.
m[z][y][x][0]=zfilt.
m[z][y][x][maxt]-xyfilt.
m[z][y][x][maxt];
168 if(peak.
m[z][y][x][0]<0.0) peak.
m[z][y][x][0]=0.0;
170 if(maxt>0) peak.
m[z][y][x][0]/=(float)maxt;
174 for(
int y=0; y<dimy; y++) {
175 for(
int x=0; x<dimx; x++) {
176 float d=1.0+hypotf((
float)x-dimx/2, (
float)y-dimy/2);
177 for(
int z=0; z<dimz; z++)
178 peak.
m[z][y][x][0]/=d;
184 if(verbose>1) printf(
"writing peak image...\n");
187 fprintf(stderr,
"Error: %s\n", peak.
statmsg);
191 if(verbose>0) fprintf(stdout,
"Peak image %s saved.\n", peakfile);
204 fprintf(stderr,
"Error: out of memory.\n");
213 fprintf(stderr,
"Error: cannot calculate mean over z dimension.\n");
220 float pmax=zimg.
m[0][1][1][0];
221 for(
int y=1; y<dimy-1; y++)
for(
int x=1; x<dimx-1; x++)
if(zimg.
m[0][y][x][0]>pmax) {
222 pmax=zimg.
m[0][y][x][0]; px=x; py=y;
224 if(verbose>1) printf(
"estimated x,y position is %d,%d\n", 1+px, 1+py);
233 int xpos[dimz], ypos[dimz];
234 for(
int z=0; z<dimz; z++) {
237 for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++)
238 if(zmask.
m[0][y][x][0]>0.5 && peak.
m[z][y][x][0]>zmax[z]) {
239 py=y; px=x; zmax[z]=peak.
m[z][y][x][0];
242 xpos[z]=px; ypos[z]=py;
248 if(verbose>1) printf(
"growing from max of each plane\n");
249 for(
int z=0; z<dimz; z++) {
258 if(verbose>1) printf(
"writing mask image...\n");
261 fprintf(stderr,
"Error: %s\n", mask.
statmsg);
265 if(verbose>0) fprintf(stdout,
"Mask image %s saved.\n", maskfile);
269 if(verbose>0) printf(
"done.\n");
unsigned long long imgNaNs(IMG *img, int fix)
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
int imgDup(IMG *img1, IMG *img2)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
int imgMeanFilter(IMG *img, int xn, int yn, int zn, int tn, int verbose)
int imgMeanZ(IMG *img1, IMG *img2)
float fmedian(float *data, long long int n)
int imgRegionGrowingByThreshold(IMG *img, const int sz, const int sy, const int sx, float lthr, float uthr, IMG *mask, int verbose)
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)