Giáo trình xử lý ảnh y tế Tập 1a P4 doc

11 525 0
  • Loading ...
1/11 trang

Thông tin tài liệu

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

Có nghĩa là mỗi một mẫu đều có một giá trị bằng nó tương ứng. Vì thế, biểu thức (3.11) có thể viết lại thành: ),h(0,0) + ),(),()[0,( + )],(),()[,(),( 21 211 1k 2111 2211 1 22112121 1 1 2 nx(n nknxnknxkh knknxknknxkkhnny N N Nk N k         (3.15) Do vậy làm giảm đi số phép nhân cần thiết để thực hiện bộ lọc. Cho bộ lọc đối xứng vòng tròn chúng ta có ),(),(),(),( 2 1 2 1 2 1 2 1 kkhkkhkkhkkh  Và N1 = N2 = N. Biểu thức (3.14) có thể viết lại ),00 )],(),( ),(),( )],( ),(),( ),()[,(),( 21 2121 2121 2211 22112211 1 1 22112121 1 2 n)x(n,h( nknxknnx nknxknnx knknx knknxknknx knknxkkhnny N k N k + + k)[h(0,+ + + N 1=k          (3.16) Các bộ lọc đối xứng vòng tròn biểu diễn tích đối xứng bát giác (xem kết quả của ví dụ 2.5 và 2.6 cho trong chương 2). Vì vậy h(k 1 ,k 2 ) = h(k 2 ,k 1 ) Và ở đây biểu thức (3.16) có thể viết lại thành     N k N k knknxkkhnny 1 1 22112121 1 2 ),()[,(),( ),(),( 22111221 knknxknknx + )],( ),(),( ),(),( 1221 22111221 22111221 knknx knknxknknx knknxknknx        + + + ),()0,0()],(),( ),(),( )],(),( ),(),()[,( 212121 2121 2121 1 2121 nnxhnknxknnx nknxknnx knknxknknx knknxknknxkkh N k        + k)[h(0,+ + + N 1=k 3.4 Phần mềm thực hiện của các bộ lọc 2-D có đáp ứng xung hữu hạn Trong phần này chúng tôi sẽ trình bày phương pháp thực hiện bằng phần mềm bộ lọc 2-D FIR cho xử lý ảnh số. Chúng ta sẽ coi rằng ảnh được lưu trên bộ nhớ ngoài như đĩa cứng hay vùng đệmảnh. Số dòng tối thiểu cần cho việc xử lý, được lưu trong bộ nhớ, cho phép lọc các ảnh lớn mà không cần dự trữ một lượng lớn bộ nhớ của máy tính. Phương pháp này được mô tả bằng sơ đồ trong hình 3.1 Hình 3.1 Lọc 2-D. Thuật toán gồm các bước sau: 1. Xoá bộ đệm ảnh, w. 2. Cho n 1 = (0, 1, 2, , (chiều dài ảnh -1), hãy làm các công việc sau: a. Chuyển hàng thứ n 1 từ bộ đệm ảnh hoặc từ file ảnh lên hàng cuối cùng trong w. (Chúng ta coi rằng ảnh được biểu diễn bằng 8 bit hay 256 mức xám). b. Cho n 2 = 0, 1, 2, , (chiều rộng ảnh-1) làm các công việc sau: (1) Tính z(n 2 ) từ Lưu tr ữ tại bộ nhớ ngo ài hay bộ đệm ảnh. Hàng thứ n 1 dịch n 2 B ộ đệm chuyển đổi ảnh w . (trong bộ nhớ trong) kích thước = (2N + 1)  độ rộng của ảnh. ),(),( 22121 21 2 knkNwkkhz N Nk N Nk n    Buffer. Kích thước = 1  độ rộng ảnh. 2 n z (0,2N) (0,0) Đ ộ rộng của ảnh Chi ều dài c ủa ảnh ((độ_rộng_của_ảnh-1),0) n 1 Bộ đệm ảnh      N Nk N Nk knkNwkkhnz 1 2 ),(),()( 221212 (2) Lưu z(n 2 ) trong bộ đệm tại vùng n 2 . c. Copy bộ đệm ra file trung gian trên đĩa cứng. d. Dịch chuyển hàng của w theo hướng như trong hình 3.1, cụ thể, cho i = 0, 1, , (2N - 1) làm các công việc sau: 1  ii rowrow 3. Đọc ảnh đã lọc từ file trung gian, chia độ và dịch chuyển để các giá trị nằm trong khoảng từ 0 đến 255 (8 bit). 4. Lưu ảnh đã được chia độ lên file hoặc bộ đệm ảnh. 5. Xoá file trung gian. 6. Hiện thị ảnh đã được lọc. Chú ý rằng biểu thức được dùng trong thuật toán này,      N Nk N Nk knkNwkkhnz 1 2 ),(),()( 221212 (3.18) Để lọc ảnh có hơi khác với biểu thức truy hồi (3.11). Điểm khác thứ nhất: N là một hằng số thay thế cho n 1 , với n 1 là một biến trong biểu thức (3.11). Biến trong thuật toán này được tính ra bằng cách dịch chuyển hàng trong w. Giải thuật trên dẫn đến cùng một kết quả với biểu thức      N Nk N Nk knkNnxkkhnny 1 2 ),(),(),( 22112121 (3.19) Tương tự như biểu thức (3.11) ngoại trừ một dịch chuyển của N hàng trên ảnh ra,       N Nk N Nk kkN zzzzXkkhzzY 1 2 21 21 212121 ),(),(),( hay        N Nk N Nk kk N zzkkhz zzX zzY 1 2 21 21211 21 21 ),( ),( ),( (3.20) Chính là biến đổi z trong biểu thức (3.11) được nhân với một trễ dọc N z  1 . Để tính bộ lọc đối xứng vòng tròn, biểu thức (3.18) có thể viết lại dưới dạng biểu thức (3.17) bằng cách thay n 1 bằng N. ),( )],(),( ),(),( )],(),( ),(),( )],(),( ),(),( ),(),( ),(),([),()( 2 22 22 22 22 122221 122221 122221 1 1 122221212 21 1 2 nNw nkNwknNw nkNwknNw knkNwknkNw knkNwknkNw knkNwknkNw knkNwknkNw knkNwknkNw knkNwknkNwkkhnz kk N k N k h(0,0)+ + k)[h(0,+ + k)[h(k,+ + + + N 1=k N 1=k               (3.21) Chương trình 3.1 “FIR.C”. Lọc ảnh dùng kiểu lọc FIR. /*PROGRAM 3.1 "FIR.C". Program for filtering Images using FIR type filters.*/ /* This program is for filtering images using the algorithm described in sec.3.4. The filter type is FIR. No assumptions are made regarding the filter coefficients (e.g. circular symmetry). Thus, the program is general enough to be used with any type of FIR filter. The FIR filter coefficients can be obtained using the the Simpson's double integration program described in chapter II. */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <alloc.h> #include <conio.h> #include <io.h> #include <ctype.h> #include <string.h> void main() { int i,j,n1,n2,N,NT,N2,image_width, image_length,k1,k2; int true_width,true_length,ind; char file_name[14],ch; unsigned char **w; unsigned char *temp; float **h,max,min; float nsq, zn2, tmp; FILE *fptr, *fptr1, *fptr_tmp; clrscr(); printf ("Enter file name containing FIR filter coefficients ->"); scanf("%s",file_name); if((fptr=fopen(file_name,"r"))==NULL) { printf("%s does not exist.",file_name); exit(1); } /* calculating order of filter. */ nsq=0; while(fscanf(fptr,"%f ", &tmp)!=EOF) nsq++; rewind(fptr); NT=sqrt(nsq); printf("Order of filter %d x %d",NT,NT); N=(NT-1)>>1; N2=N<<1; /* Allocating memory for filter coefficients h[i][j] */ h=(float **)malloc(NT*sizeof(float *)); for(i=0;i<NT;i++) *(h+i)=(float *)calloc(NT,sizeof(float)); printf("\n FILTER COEFFICIENTS.\n"); for(i=0;i<NT;i++) { for(j=0;j<NT;j++) { fscanf(fptr,"%f ", &h[i][j]); printf("%f ",*((*(h+i))+j)); } printf("\n"); } fclose(fptr); printf ("Press any key to continue, Screen will be cleared. "); getch(); clrscr(); printf("Enter file name for input image ->"); scanf("%s",file_name); if((fptr=fopen(file_name,"rb"))==NULL) { printf("%s does not exist.", file_name); printf("\nPress any key to exit."); getch(); exit(1); } nsq=filelength(fileno(fptr)); printf("is this a square image ?"); printf("\n i.e. Is image_length=image_width (y or n)? -> "); while(((ch=tolower(getch()))!='y')&&(ch!='n')); putch(ch); switch(ch) { case 'y': image_length=image_width=sqrt(nsq); printf("\n Image size = %d x %d", image_length, image_width); break; case 'n': printf("\nEnter image_width >"); scanf("%d",&image_width); image_length=nsq/image_width; printf("Image length is %d", image_length); break; } /* opening a temporary file. */ fptr_tmp=fopen("temp_img.dat","w+"); gotoxy(70,25); textattr(WHITE+(GREEN<<4)+BLINK); cputs("WAIT"); /* Allocating memory for Image Transfer Buffer, w. */ w=(unsigned char **)malloc(NT*sizeof(char *)); for(i=0;i<NT;i++) *(w+i)=(char *)calloc(image_width,sizeof(char)); /* Clear Image Transfer Buffer. */ for(i=0;i<NT;i++) for(j=0;j<image_width;j++) *((*(w+i))+j)=(unsigned char)0; max=(float)0.0; min=(float)255.0; true_length=(int)image_length*0.90; true_width=image_width-NT; /************* * Algorithm * *************/ for(n1=0; n1<image_length;n1++) { gotoxy(1,9); printf(" Transferred line %-4d to image transfer buffer. ",n1); /* Transfer row n2 of the image to the last row of w. */ for(j=0;j<image_width;j++) { ch= (char)fgetc(fptr); *((*(w+N2))+j) = (unsigned char)ch; } for(n2=0; n2<image_width; n2++) { zn2=(float)0.0; for(k1=-N; k1<=N; k1++) for(k2=-N; k2<=N; k2++) { if( ((n2-k2)<0) || ((n2-k2)>=image_width) ) continue; tmp=(float) (*((*(w+N-k1))+(n2-k2))); zn2+=(*((*(h+N+k1))+(N+k2)))*tmp; } /* Excluding boundary values from determining the max. and min.values */ if((n1>N2)&&(n1<true_length)&&(n2>N2)&&(n2<true_width)) { if(zn2>max) max=zn2; if(zn2<min) min=zn2; } fprintf(fptr_tmp,"%f ",zn2); /* The buffer is implicit in this last statement.*/ } /* shift rows of w */ temp=*w; for(j=0; j<N2; j++) *(w+j)=*(w+j+1); *(w+N2)=temp; } fclose(fptr); /* close input image file */ gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs(" "); gotoxy(1,10); printf("Filtering is now completed."); printf("\nMax. and min. values in filtered image =>%f,%f",max, min); printf("\n Next, bias will be adjusted and the final "); printf("\n filtered image will be saved in a file."); rewind(fptr_tmp); again: gotoxy(1,15); printf( " "); gotoxy(1,15); printf("Enter file name for filtered image ->"); scanf("%s",file_name); if((stricmp("temp_img.dat",file_name))==0) { printf("This is a reserved file name. Use some other name."); goto again; } gotoxy(1,16); printf( " "); ind=access(file_name,0); while(!ind) { gotoxy(1,16); 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,15); printf ( " "); gotoxy(1,15); printf("Enter file name >"); scanf("%s",file_name); ind=access(file_name,0); } } fptr1=fopen(file_name, "wb"); gotoxy(70,25); textattr(WHITE+(GREEN<<4)+BLINK); cputs("WAIT"); for(n1=0; n1<image_length; n1++) { gotoxy(1,17); printf("scaling line %-4d.",n1); for(n2=0; n2<image_width; n2++) { fscanf(fptr_tmp,"%f", &zn2); /*scaling output image between 0 and 255. */ zn2= (zn2-min)*(float)255.0/(max-min) + (float)0.4; putc((unsigned char)zn2,fptr1); } } fclose(fptr_tmp); remove("temp_img.dat"); gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs(" "); fclose(fptr1); /* close output-image file */ gotoxy(1,20); printf("DONE."); } Chương trình 3.1 có thể được dùng để lọc ảnh với bộ lọc FIR với bất kỳ đặc tính nào. Tuy nhiên, vì mục đích của chúng ta là sử dụng bộ lọc đối xứng tuần hoàn trên ảnh, việc tính toán sẽ hiệu quả hơn nếu ta thay đổi chương trình với sự cải tiến của hệ số tuần hoàn. Trước khi thực hiện bất kỳ thay đổi nào trong chương trình 3.1 chúng ta sẽ sử dụng nó để lọc một ảnh. Ảnh dùng để kiểm tra là ảnh nằm trên đĩa kèm theo có tên IKRAM.IMG. Yêu cầu khi chạy chương trình là chúng ta phải thu được hệ số của bộ lọc FIR. Điều này dễ dàng đạt được bằng cách tận dụng chương trình với quy tắc Simpon để gấp đôi ảnh. Điều này được cung cấp trong chương 2, chương trình 2.1. Bộ lọc thông thấp đối xứng tuần hoàn và bộ lọc thông cao Butterworth, mỗi bộ với điểm 0.3 3-dB, thực hiện như bộ lọc FIR kích thước 5  5, được tận dụng. Hình 3.2a cho thấy ảnh gốc (IKRAM.IMG). Hình 3.2b giới thiệu ảnh lọc thông cao. Hình 3.2c là ảnh lọc thông thấp. Đúng như sự mong đợi, ảnh lọc thông cao rõ nét hơn ảnh gốc. Ảnh lọc thông thấp mờ hơn. Mặc dù vậy, ảnh lọc thông cao dường như thiếu sự phân lượng mức xám. Sự giảm bớt phân lượng mức xám có thể được coi là do hầu hết các ảnh có phổ giảm nhanh như một hàm của tần số. Một phương pháp cho ảnh kết quả rõ hơn và giữ được sự phân lượng mức xám cao hơn là trung bình ảnh gốc với ảnh lọc thông cao. Kết quả của phương pháp này được cho trong hình 3.3. Nếu bạn chưa mua được một khung hình số và một màn hình đen trắng, bạn vẫn có thể hiển thị ảnh mức xám trên màn hình VGA thông qua bộ thích ứng VGA. Chương trình thực hiện điều này được cung cấp sẵn trong đĩa kèm theo. . Trong phần n y chúng tôi sẽ trình b y phương pháp thực hiện bằng phần mềm bộ lọc 2-D FIR cho xử lý ảnh số. Chúng ta sẽ coi rằng ảnh được lưu trên bộ nhớ ngoài như đĩa cứng hay vùng đệmảnh. Số dòng. hiện bất kỳ thay đổi nào trong chương trình 3.1 chúng ta sẽ sử dụng nó để lọc một ảnh. Ảnh dùng để kiểm tra là ảnh nằm trên đĩa kèm theo có tên IKRAM.IMG. Y u cầu khi ch y chương trình là chúng. đệm ảnh, w. 2. Cho n 1 = (0, 1, 2, , (chiều dài ảnh -1), h y làm các công việc sau: a. Chuyển hàng thứ n 1 từ bộ đệm ảnh hoặc từ file ảnh lên hàng cuối cùng trong w. (Chúng ta coi rằng ảnh
- Xem thêm -

Xem thêm: Giáo trình xử lý ảnh y tế Tập 1a P4 doc, Giáo trình xử lý ảnh y tế Tập 1a P4 doc, Giáo trình xử lý ảnh y tế Tập 1a P4 doc

Gợi ý tài liệu liên quan cho bạn

Nhận lời giải ngay chưa đến 10 phút Đăng bài tập ngay