www.pudn.com > 医学算法.rar > median.c
#include#define N 1000 /* Maximum number of points in */ /* a projection. */ /* median - one dimensional median filter carl crawford purdue university west lafayette, indiana 47907 april 14, 1980 Revisions: -r flag (recursive filter) crc 10/5/81 -p flag (don't print program status) crc 10/5/81 */ /* syntax: median [options] VARIABLES: DEFAULT if: input file stdin of: output file stdout m: window size 3 n: number of samples per projection 100 k: number of projections 1 -r: recursive filter -p: don't print program status */ char *ifn; /* input file name */ int uif; /* 1=use input file name */ char *ofn; /* output file name */ int uof; /* 1=use output file name */ FILE *ifd; /* input file descriptor */ FILE *ofd; /* output file descriptor */ int m = 3; /* window size, must be odd */ int n = 100; /* samples per projection */ int k = 1; /* number of projections */ int print; /* 1=don't print program status */ int rec; /* 1=use recursive filter */ char *table[] = { "if", "of", "m", "n", "k", 0 }; main(argc,argv) int argc; char **argv; { char c; float tmp,buf[N],win[100]; int m1,m2,m3; register int i,j,l; while(++argv,--argc){ if(**argv == '-')while(c = *++*argv)switch(c){ case 'r': /* recursive filter */ rec = 1; break; case 'p': /* don't print program status */ print = 1; break; default: fprintf(stderr,"bad flag: -%c\n",c); exit(1); }else switch(comm(*argv)){ case 1: /* input file name */ ifn = *argv+3; uif = 1; break; case 2: /* output file name */ ofn = *argv+3; uof = 1; break; case 3: /* m */ m = atoi(*argv + 2); break; case 4: /* n */ n = atoi(*argv + 2); if (n>N){ fprintf(stderr,"%s:n must be less than %d.\n", n); exit(1); } break; case 5: /* k */ k = atoi(*argv + 2); break; } } if(uif){ if((ifd = fopen(ifn,"r")) == NULL){ fprintf(stderr,"can't open: %s\n",ifn); exit(1); } }else{ ifd = stdin; } if(uof){ if((ofd = fopen(ofn,"w")) == NULL){ fprintf(stderr,"can't create: %s\n",ofn); exit(1); } }else{ ofd = stdout; } if(! ( m & 1) ){ fprintf(stderr,"window size must be odd\n"); exit(1); } if(k <= 0){ fprintf(stderr,"bad k\n"); exit(1); } if(n <= 0){ fprintf(stderr,"bad n\n"); exit(1); } if(!print){ printf("MEDIAN DATA\n\n"); printf("n=%d\n",n); printf("k=%d\n",k); printf("m=%d\n",m); printf("if:%s\n",(uif)? ifn : "stdin"); printf("of:%s\n",(uof)? ofn : "stdout"); if(rec)printf("recursive filter\n"); } m2 = m >> 1; m1 = m - 1; m3 = n - m + 1; while(k--){ if(fread(buf,sizeof(float),n,ifd) != n){ fprintf(stderr,"unexpected EOF\n"); exit(1); } fwrite(buf,sizeof(float),m2,ofd); for(i=0;i win[l]){ tmp = win[j]; win[j] = win[l]; win[l] = tmp; } } } fwrite(win+m2,sizeof(float),1,ofd); if(rec)buf[i+m2] = win[m2]; } fwrite(buf+n-m2,sizeof(float),m2,ofd); } } comm(s) char *s; { register int i,j,r; for(i=0;table[i];i++){ for(j=0;(r=table[i][j]) == s[j] && r;j++); if(r == 0 && s[j] == '=' && s[j+1] )return(i+1); } fprintf(stderr,"bad option: %s\n",s); exit(1); return(0); }