Giáo trình xử lý ảnh y tế Tập 2 P9 docx

8 305 0
Giáo trình xử lý ảnh y tế Tập 2 P9 docx

Đang tải... (xem toàn văn)

Thông tin tài liệu

177 rằng không thể loại trừ tính không nhân quả bằng một phép toán đơn giản. Nếu chúng ta, nói một cách khác, giả thiết điều kiện ban đầu là 0, chúng ta quay trở lại hàm truyền đạt (9.1) với kích thước mới là 2N  2N. Lựa chọn thứ hai yêu cầu một bộ lọc có bậc nhỏ nhất là 2 2 MM  . Điều này làm tiêu tan những mục đích mà chúng ta đặt ra trước đây khi chọn bộ lọc IIR trước FIR. Sự cần thiết cho những bậc cao phát sinh từ thực tế là: đáp ứng xung bắt đầu gần như từ không và tăng lên đến cực đại sau trễ của 2 M mẫu theo cả hai hướng. Nghĩa là một đơn vị mẫu vào cần trải qua một khoảng thời gian trễ khá lớn. Lựa chọn thứ ba bắt nguồn từ thực tế rằng nếu như phổ biên độ đã tính bằng cách dùng góc phần tư đơn lẻ này, trong trường hợp đối xứng vòng tròn, nó sẽ cho kết quả của phổ biên độ như đã chỉ ra lúc đầu. Tuy nhiên đặc tính pha sẽ không phải là đặc tính pha sẽ chỉ ra lúc đầu. Lựa chọn thứ tư, dùng hai tính chất của biến đổi Fourier : 1. Đáp ứng xung giảm đi rất nhanh khi ra xa khỏi trung tâm . 2. Một dịch chuyển trong đáp ứng xung thì tương đương với một phép cộng một pha tuyến tính vào đặc tuyến tần số. Như chúng tôi đã nhấn mạnh trong các chương trước, pha tuyến tính là một mong muốn trong xử lý ảnh. Nếu chúng ta bắt đầu với trường hợp pha không, sau đó áp dụng lựa chọn cuối cùng chúng ta có thể thiết kế bộ lọc với pha gần như tuyến tính. Chú ý rằng “dịch chuyển” trong hình 9.3b tốt nhất là nên đặt là N - 1. Dùng đặc tuyến tần số cho bộ lọc thông cao với N = 2, và dịch chuyển = 1, ta có thể thiết kế hàm truyền đạt dùng các giả thiết của Shanks. Độ lớn, góc pha, và đáp ứng xung của bộ lọc thiết kế cho ở hình 9.4, 9.5 và 9.6. Các hệ số của bộ lọc cho ở bảng 9.1. Bảng 9.1 Hệ số của bộ lọc Hệ số a Hệ số b Chỉ số i,j - 1.000000 0,0 - - 0.561535 0,1 - 0.006960 0,2 - - 0.561535 1,0 0.978508 0.369372 1,1 - 0.006188 1,2 - 0.006960 2,0 - 0.006188 2,1 0.357313 0.003567 2,2 178 Dễ thấy từ các hình này là bộ lọc có miền chuyển tiếp dốc hơn so với bộ lọc FIR 5  5 cùng thông số. Nó có đặc tuyến pha tuyến tính và ổn định hơn. Để chứng minh là bộ lọc IIR có miền chuyển tiếp dốc hơn bộ lọc FIR có cùng các hệ số, bạn hãy chạy thử chương trình thiết kế bộ lọc FIR và sau đó so sánh kết quả. Hình 9.4 Phổ biên độ của bộ lọc 2-D. 179 Hình 9.5 Phổ pha của bộ lọc IIR 2-D. Hình 9.6 Đáp ứng tần số của bộ lọc IIR. Chương trình dùng để thiết kế bộ lọc IIR dùng các giả thiết của Shanks cho ở chương trình 9.2. Chương trình 9.2 "IIRD.C". Thiết kế mạch lọc dùng phương pháp Shanks. /* This program is for designing 2-D IIR filters using Shanks's method. You will need to run IMPULSE.EXE first. */ #define pi 3.141592654 #include <stdio.h> #include <conio.h> #include <io.h> #include <alloc.h> #include <math.h> #include <stdlib.h> #include <ctype.h> void SIMQ(float *,int); 180 void main() { FILE *fptri,*fptro; double nsq; int M,i,j,l,k,m,n,N,N1,N2,kk1,kk2,Nt,M1,NO,MSQ,M2,y,MC,yt,ind; float *A, **a,**b,*buffi,sum; float zrt,zit,zrb,zib,mag,*w,winc; float *h,xrm,xim,xrn,xin,rl,im,theta; char file_name[14],ch; clrscr(); printf("Enter file name for impulse response >"); scanf("%s",file_name); fptri=fopen(file_name,"rb"); if(fptri==NULL) { printf("File does not exist."); exit(1); } nsq=(double)(filelength(fileno(fptri))/sizeof(float)); M=(int)sqrt(nsq); printf("Enter order of 2-D IIR filter (e.g. 1,2 etc.) >"); scanf("%d",&N); NO=N-1; /* printf("Enter offset of impulse response.\n"); printf(" Optimum value is (order of filter-1) >"); scanf("%d",&NO); */ M1=M/2+NO; M2=M/2-NO; MSQ=M1*M1; fseek(fptri,(long)(M2)*(long)(M*sizeof(float)),SEEK_SET); /* Allocating memory for impulse response. */ h=(float *)malloc(MSQ*sizeof(float)); /* Allocating memory for b coefficients. */ b=(float **)malloc((N+1)*sizeof(float *)); for(i=0;i<=N;i++) *(b+i)=(float *)malloc((N+1)*sizeof(float)); /* Allocating memory for a coefficients. */ a=(float **)malloc((N+1)*sizeof(float *)); for(i=0;i<=N;i++) *(a+i)=(float *)malloc((N+1)*sizeof(float)); /* Allocating memory space for matrix A.*/ N1=(N+1)*(N+1)-1; 181 N2=(N+1)*(N+1); A=(float *)malloc(N1*N2*sizeof(float)); /* Allocating memory for freq. vector. */ w=(float *)malloc((M+1)*sizeof(float)); /* Reading in the impulse response. */ buffi=(float *)malloc(M*sizeof(float)); for(i=M2;i<M;i++) { fread(buffi,M,sizeof(float),fptri); for(j=M2;j<M;j++) h[(i-M2)*M1+j-M2]=buffi[j]; } fclose(fptri); y=wherey(); gotoxy(70,25); textattr(WHITE+(GREEN<<4)+BLINK); cputs("WAIT"); /* Forming the A-matrix. */ kk1=0; for(l=0;l<=N;l++) for(k=0;k<=N;k++) { if((l+k)==0) continue; kk2=0 ; for(i=0;i<=N;i++) for(j=0;j<=N;j++) { if((i+j)==0) continue; if(kk2>=kk1) { sum=(float)0.0; for(m=0;m<M1;m++) for(n=0;n<M1;n++) { if((n<=N) && (m<=N)) continue; if(((m-i)<0)||((n-j)<0)||((m-l)<0)||((n-k)<0)) continue; sum+=h[(m-i)*M1+(n-j)]*h[(m-l)*M1+(n-k)]; } A[kk1*N2+kk2]=sum; } else A[kk1*N2+kk2]=A[kk2*N2+kk1]; kk2++; 182 } sum=(float)0.0; for(m=0;m<M1;m++) for(n=0;n<M1;n++) { if((n<=N) && (m<=N)) continue; if(((m-1)<0)||((n-k)<0)) continue; sum-=h[m*M1+n]*h[(m-l)*M1+(n-k)]; } A[kk1*N2+N1]=sum; kk1++; } SIMQ(A,N1); /* Obtaining b. */ b[0][0]=1.0; kk1=0; for(i=0;i<=N;i++) for(j=0;j<=N;j++) { if((i+j)==0) continue; b[i][j]=A[kk1*N2+N1]; kk1++; } /* Solving for a coefficients. */ for(m=0;m<=N;m++) for(n=0;n<=N;n++) { a[m][n]=(float)0.0; for(i=0;i<=N;i++) for(j=0;j<=N;j++) { if(((m-i)<0)||((n-j)<0)) continue; a[m][n]+=b[i][j]*h[(m-i)*M1+(n-j)]; } } gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs(" "); gotoxy(1,y); printf("\n a & b coefficients.\n"); for(i=0;i<=N;i++) for(j=0;j<=N;j++) printf(" %e %e\n", a[i][j],b[i][j]); yt=wherey(); 183 gotoxy(1,yt+2); printf("Enter file name for storing coefficients >"); scanf("%s",file_name); ind=access(file_name,0); while(!ind) { gotoxy(1,yt+3); printf( " "); gotoxy(1,yt+3); printf("File exists. Wish to overwrite? (y or n) >"); while(((ch=tolower(getch()))!='y')&&(ch!='n')); putch(ch); switch(ch) { case 'y': ind=1; break; case 'n': gotoxy(1,yt+3); printf(" "); gotoxy(1,yt+2); printf(" "); gotoxy(1,yt+2); printf("Enter file name >"); scanf("%s",file_name); ind=access(file_name,0); } } fptro=fopen(file_name, "w"); fprintf(fptro, " %d" , N); for(i=0;i<=N;i++) for(j=0;j<=N;j++) fprintf(fptro," %f %f",a[i][j],b[i][j]); fclose(fptro); printf ("\n\n Do you wish to calculate and store impulse \n"); printf(" magnitude and phase responses for 3-D plotting? >"); while(((ch=tolower(getch()))!='y')&&(ch!='n')); putch(ch); if(ch=='n') exit(1); printf("\nEnter number of points to be calculated (e.g. 32x32) >"); scanf("%dx%d",&MC,&MC); free(h), MSQ=MC*MC; h=(float *)malloc(MSQ*sizeof(float)); 184 /* Calculating the impulse response. */ for(m=0;m<MC;m++) for(n=0;n<MC;n++) { if((m<=N)&&(n<=N)) h[m*MC+n]=a[m][n]; else h[m*MC+n]=0.0; for(i=0;i<=N;i++) for(j=0;j<=N;j++) { if((i+j)==0) continue; if(((m-i)<0)||((n-j)<0)) continue; h[m*MC+n]-=b[i][j]*h[(m-1)*MC+(n-j)]; } } printf("\nEnter file_name for storing impulse response"); printf("\n of designed filter > "); scanf("%s",file_name); fptro=fopen(file_name,"w"); fprintf(fptro,"%d %d\n",MC,MC); fprintf(fptro,"%e",(float)0.0); for(i=0;i<MC;i++) fprintf(fptro," %e",(float)i); for(i=0;i<MC;i++) { fprintf(fptro,"\n%e",(float)i); for(j=0;j<MC;j++) fprintf(fptro," %e",h[i*MC+j]); } fclose(fptro); printf("\nEnter file for storing Magnitude Response > "); scanf("%s",file_name); Nt=MC+1; fptro=fopen(file_name,"w"); printf("\nEnter file for storing Phase Response >"); scanf("%s",file_name); fptri=fopen(file_name,"w"); fprintf(fptro,"%d %d\n",Nt,Nt); fprintf(fptro,"%e",(float)0.0); fprintf(fptri,"%d %d\n",Nt,Nt); fprintf(fptri,"%e",(float)0.0); w[0]=-pi; winc=2.0*pi/(float)MC; for(i=1;i<Nt;i++) . 0 ,2 - - 0.561535 1,0 0.978508 0.3693 72 1,1 - 0.006188 1 ,2 - 0.006960 2, 0 - 0.006188 2, 1 0.357313 0.003567 2, 2 178 Dễ th y từ các hình n y là bộ lọc có miền chuyển. switch(ch) { case &apos ;y& apos;: ind=1; break; case 'n': gotoxy(1,yt+3); printf(" "); gotoxy(1,yt +2) ; printf(" "); gotoxy(1,yt +2) ; printf("Enter. *)malloc(M*sizeof(float)); for(i=M2;i<M;i++) { fread(buffi,M,sizeof(float),fptri); for(j=M2;j<M;j++) h[(i-M2)*M1+j-M2]=buffi[j]; } fclose(fptri); y= wherey(); gotoxy(70 ,25 ); textattr(WHITE+(GREEN<<4)+BLINK);

Ngày đăng: 10/07/2014, 22:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan