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.",
33 " TIFF showing initial mask for all image planes.",
36 "See also: eabaort, imgprofi, imgthrs, imgfsegm, imgzavg, imgmax, img2tif",
38 "Keywords: image, input, blood, aorta, mask",
57int main(
int argc,
char **argv)
59 int ai, help=0, version=0, verbose=1;
61 char *cptr, imgfile[FILENAME_MAX], maskfile[FILENAME_MAX];
62 char peakfile[FILENAME_MAX], zmaskfile[FILENAME_MAX];
68 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
69 imgfile[0]=maskfile[0]=(char)0;
72 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
73 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
75 if(strncasecmp(cptr,
"PEAK=", 5)==0) {
76 strlcpy(peakfile, cptr+5, FILENAME_MAX);
continue;
77 }
else if(strncasecmp(cptr,
"ZMASK=", 6)==0) {
78 strlcpy(zmaskfile, cptr+6, FILENAME_MAX);
continue;
80 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
85 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
90 if(ai<argc) {
strlcpy(imgfile, argv[ai], FILENAME_MAX); ai++;}
91 if(ai<argc) {
strlcpy(maskfile, argv[ai], FILENAME_MAX); ai++;}
92 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
96 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
100 fprintf(stderr,
"Error: invalid file name for TIF.\n");
106 printf(
"imgfile := %s\n", imgfile);
107 printf(
"maskfile := %s\n", maskfile);
108 printf(
"zmaskfile := %s\n", zmaskfile);
109 if(peakfile[0]) printf(
"peakfile := %s\n", peakfile);
116 if(verbose>0) fprintf(stdout,
"reading dynamic image %s\n", imgfile);
120 fprintf(stderr,
"Error: %s\n", img.
statmsg);
121 if(verbose>1) printf(
"ret := %d\n", ret);
125 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
128 fprintf(stderr,
"Error: %s is not an image.\n", imgfile);
131 int dimt, dimz, dimy, dimx;
133 if(verbose>0) fprintf(stdout,
" dim[x,y,z,t] := %d, %d, %d, %d\n", dimx, dimy, dimz, dimt);
141 ret=
imgDup(&img, &xyfilt);
142 if(ret==0) ret=
imgDup(&img, &zfilt);
144 fprintf(stderr,
"Error: cannot setup IMG data.\n");
145 if(verbose>1) fprintf(stderr,
"ret := %d\n", ret);
151 fprintf(stderr,
"Error: cannot filter the image.\n");
152 if(verbose>1) fprintf(stderr,
"ret := %d\n", ret);
163 fprintf(stderr,
"Error: out of memory.\n");
167 for(
int z=0; z<dimz; z++)
168 for(
int y=0; y<dimy; y++)
169 for(
int x=0; x<dimx; x++) {
173 for(
int t=0; t<dimt; t++) {
174 if(xyfilt.
m[z][y][x][t]>maxv) {maxt=t; maxv=xyfilt.
m[z][y][x][t];}
176 peak.
m[z][y][x][0]=zfilt.
m[z][y][x][maxt]-xyfilt.
m[z][y][x][maxt];
177 if(peak.
m[z][y][x][0]<0.0) peak.
m[z][y][x][0]=0.0;
179 if(maxt>0) peak.
m[z][y][x][0]/=(float)maxt;
183 for(
int y=0; y<dimy; y++) {
184 for(
int x=0; x<dimx; x++) {
185 float d=1.0+hypotf((
float)x-dimx/2, (
float)y-dimy/2);
186 for(
int z=0; z<dimz; z++)
187 peak.
m[z][y][x][0]/=d;
193 if(verbose>1) printf(
"writing peak image...\n");
196 fprintf(stderr,
"Error: %s\n", peak.
statmsg);
200 if(verbose>0) fprintf(stdout,
"Peak image %s saved.\n", peakfile);
213 fprintf(stderr,
"Error: out of memory.\n");
222 fprintf(stderr,
"Error: cannot calculate mean over z dimension.\n");
229 float pmax=zimg.
m[0][1][1][0];
230 for(
int y=1; y<dimy-1; y++)
for(
int x=1; x<dimx-1; x++)
if(zimg.
m[0][y][x][0]>pmax) {
231 pmax=zimg.
m[0][y][x][0]; px=x; py=y;
233 if(verbose>1) printf(
"estimated x,y position is %d,%d\n", 1+px, 1+py);
241 if(verbose>1) printf(
"writing zmask as TIFF...\n");
245 fprintf(stderr,
"Error: cannot write %s\n", zmaskfile);
249 if(verbose>0) fprintf(stdout,
"Mask image %s saved.\n", maskfile);
255 int xpos[dimz], ypos[dimz];
256 if(verbose>2) printf(
"peakpos(z,y,x) max\n");
257 for(
int z=0; z<dimz; z++) {
259 int py=0, px=0, pt=0;
260 for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++) {
261 if(zmask.
m[0][y][x][0]>0.5) {
262 for(
int t=0; t<dimt; t++)
263 if(img.
m[z][y][x][t]>zmax[z]) {
264 py=y; px=x; pt=t; zmax[z]=img.
m[z][y][x][t];
266 peak.
m[z][y][x][0]=img.
m[z][y][x][pt];
268 peak.
m[z][y][x][0]=0.0;
271 xpos[z]=px; ypos[z]=py;
272 if(verbose>2) printf(
"%d,%d,%d %g\n", 1+z, ypos[z], xpos[z], zmax[z]);
288 if(verbose>2) printf(
"peakmaxmedian := %g\n", m);
290 if(verbose>1) printf(
"growing from max of each plane\n");
291 for(
int z=0; z<dimz; z++) {
300 if(verbose>1) printf(
"writing mask image...\n");
303 fprintf(stderr,
"Error: %s\n", mask.
statmsg);
307 if(verbose>0) fprintf(stdout,
"Mask image %s saved.\n", maskfile);
311 if(verbose>0) printf(
"done.\n");
char * filenameGetExtension(char *s)
Get the last extension of a filename.
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)
int tiffWriteImg(IMG *img, int plane, int frame, float *maxvalue, int colorscale, char *fname, int matXdim, int matYdim, int verbose, char *status)
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)