8#include "tpcclibConfig.h"
24static char *info[] = {
25 "Applying mean filter for a static or dynamic PET image in ECAT, NIfTI,",
26 "or Analyze format. Filtering can be applied to x,y,z-volume (3D) by",
27 "specifying the number of adjacent pixels for x,y- and z-dimensions, or only",
28 "to the x,y-planes by giving the number only for x,y-dimensions.",
29 "Only zero and odd numbers 3, 5, ... are accepted",
31 "Usage: @P [Options] imgfile outputfile Nxy [Nz]",
35 " Negative voxel values are set to 0.",
37 " Filtered image is subtracted from original image.",
40 "See also: imgfiltg, imgdysmo, imgfsegm, imgthrs, imgbkgrm, fvar4img",
42 "Keywords: image, smoothing",
61int main(
int argc,
char **argv)
63 int ai, help=0, version=0, verbose=1;
64 char petfile[FILENAME_MAX], outfile[FILENAME_MAX];
73 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
74 petfile[0]=outfile[0]=(char)0;
76 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
78 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
79 if(strncasecmp(cptr,
"NONEGATIVES", 1)==0) {
80 leaveNegat=0;
continue;
81 }
else if(strncasecmp(cptr,
"DIFFERENCE", 3)==0) {
84 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
89 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
94 if(ai<argc) {
strlcpy(petfile, argv[ai++], FILENAME_MAX);}
96 strlcpy(outfile, argv[ai++], FILENAME_MAX);
99 fprintf(stderr,
"Error: invalid output file name '%s'\n", outfile);
104 Nx=Ny=atoi(argv[ai]);
105 if(Nx>0 || strcmp(argv[ai],
"0")==0) {
108 fprintf(stderr,
"Error: invalid Nxy\n");
114 if(Nz>0 || strcmp(argv[ai],
"0")==0) {
117 fprintf(stderr,
"Error: invalid Nz\n");
121 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
125 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
128 if(strcasecmp(outfile, petfile)==0) {
129 fprintf(stderr,
"Error: check the output file name.\n");
132 if(!(Nx>0) && !(Ny>0) && !(Nz>0)) {
133 fprintf(stderr,
"Error: with given parameters no filtering is applied.\n");
136 if((Nx>0 && Nx<3) || (Ny>0 && Ny<3) || (Nz>0 && Nz<3)) {
137 fprintf(stderr,
"Error: invalid pixel number.\n");
140 if((Nx>0 && Nx%2==0) || (Ny>0 && Ny%2==0) || (Nz>0 && Nz%2==0)) {
141 fprintf(stderr,
"Error: pixel numbers must be odd.\n");
148 printf(
"petfile := %s\n", petfile);
149 printf(
"outfile := %s\n", outfile);
150 printf(
"Nx := %d\n", Nx);
151 printf(
"Ny := %d\n", Ny);
152 printf(
"Nz := %d\n", Nz);
153 printf(
"leaveNegat := %d\n", leaveNegat);
162 if(verbose>0) printf(
"reading %s\n", petfile);
164 int ret=
imgRead(petfile, &img);
166 fprintf(stderr,
"Error: %s\n", img.
statmsg);
167 if(verbose>1) printf(
"ret=%d\n", ret);
172 fprintf(stderr,
"Error: %s is not an image.\n", petfile);
176 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
179 printf(
"image_xyzf_dimensions := %d %d %d %d\n", img.
dimx, img.
dimy, img.
dimz, img.
dimt);
182 if(Nz>0 && img.
dimz<=Nz) {
183 fprintf(stderr,
"Error: invalid Z dimension for 3D filtering.\n");
186 if((Nx>0 && img.
dimx<=Nx) || (Ny>0 && img.
dimy<=Ny)) {
187 fprintf(stderr,
"Error: invalid x,y dimensions for filtering.\n");
196 int ret=
imgDup(&img, &orig);
198 fprintf(stderr,
"Error: cannot setup IMG data.\n");
199 if(verbose>1) fprintf(stderr,
"ret := %d\n", ret);
210 fprintf(stderr,
"Error: cannot filter the image.\n");
211 if(verbose>1) fprintf(stderr,
"ret := %d\n", ret);
220 for(
int z=0; z<img.
dimz; z++)
221 for(
int y=0; y<img.
dimy; y++)
222 for(
int x=0; x<img.
dimx; x++)
223 for(
int t=0; t<img.
dimt; t++)
224 img.
m[z][y][x][t]=orig.
m[z][y][x][t]-img.
m[z][y][x][t];
230 if(verbose>1) printf(
"setting negative pixel values to zero\n");
238 if(verbose>2) fprintf(stdout,
"writing %s\n", outfile);
240 fprintf(stderr,
"Error: %s\n", img.
statmsg);
244 if(verbose>0) printf(
"Written %s\n", outfile);
int atof_with_check(char *double_as_string, double *result_value)
unsigned long long imgNaNs(IMG *img, int fix)
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)
void imgCutoff(IMG *image, float cutoff, int mode)
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.