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);
}