Xử lý ảnh -
Chơng 3 Các bộ lọc hai chiều có đáp ứng xung hữu hạn3.1 Chỉ dẫnTrong chơng này chúng ta sẽ chuyển sang việc làm nổi ảnh thông qua các bộ lọc 2-D. Hệ thống 2-D mà chúng ta sẽ đề cập ở đây là các bộ lọc hai chiều đáp ứng xung có độ dài hữu hạn, mà đợc thiết kế với đặc tuyến phù hợp cho việc xử lý ảnh. Chúng ta cũng sẽ đề cập đến việc thiết kế phần mềm xử lý cho các ảnh đợc coi là chứa trên vùng đệm hoặc bộ nhớ ngoài nh đĩa cứng. Với thiết kế này các chơng trình chỉ yêu cầu dung lợng của bộ nhớ trong rất nhỏ, làm cho bộ lọc có khả năng lọc đợc các ảnh có kích thớc rất lớn. 3.2 Biến đổi ZPhép biến đổi z đóng một vai trò rất quan trọng trong việc phân tích và biểu diễn các hệ tuyến tính bất biến (linear-shift invariant - TTBB) rời rạc theo cả thời gian lẫn không gian. Mục đích của phần này là giới thiệu sơ lợc phép biến đổi z để hiểu rõ hơn về các bộ lọc hai chiều.Biến đổi z của một tín hiệu đợc lấy mẫu đồng đều f(t), đợc cho bởi{ }==0)()(nnznTfnTfZ (3.1)Biến đổi z của một d y ã f(nT) thờng đợc ký hiệu là F(z). Vì vậy{ })()( nTfZzF = (3.2)Xem xét biến đổi z của mẫu xung đơn vị kT, cụ thể))(()( TknnTf =Dùng biểu thức (3.1) chúng ta đợckzTknZ= )})(({(3.3)Bây giờ xem xét biến đổi z của một tín hiệu trễ đi k chu kỳ lấy mẫu của f(nT):==0))(()})(({nnzTknfTknfZThay m = n - k trong biểu thức bên tay phải chúng ta đợc:23 =+=kmkmzmTfTknfZ)()()})({kknmzzmTfTknfZ== ])([)})({)Nếu ),( Tmf= với m < 0 thì kzzFTknfZ= )()})({(3.4)Các biểu thức (3.3) và (3.4) coi rằng z-1 biểu diễn một đơn vị trễ cho các tín hiệu mà có giá trị 0 nếu thời gian âm hay còn gọi là tín hiệu nhân quả. Biến đổi cho trong biểu thức (3.1) gọi là phép biến đổi z một phía. Một phép biến đổi z hai phía đợc cho bởi:==nnznTfnTfZ )()}({ (3.5)Phổ tần số của tín hiệu đợc tính từ biến đổi Fourier là{ }==nnTjenTfnTf)()( (3.6)So sánh biểu thức (3.5) và biểu thức (3.6), chúng ta nhận thấy rằng phổ của một ảnh có thể rút ra từ biến đổi z bằng cách thay z bằng Tje.Ví dụ 3.1 Tìm biến đổi z và phổ tần số của d yãu nT nT n T n T n N T( ) ( ) (( ) ) (( ) ) . (( ) )= + + + + 1 2Giải Từ biểu thức (3.1) chúng ta có thể viết NzzzzU++++= .0.1)(21 hoặc 1)1(11)(++=zzzUNPhổ tần số của u(nT) sẽ làTjTNjTjeeeU+=11)()1(Biến đổi z của một tín hiệu rời rạc đều 2-D f(x,y) đợc cho bởi24 u0 1 2 3 N-1 N1n ===1 2212122112211),()},({n nnnzzTnTnfTnTnfZ(3.7)thờng đợc ký hiệu là F(z1, z2)Có thể lập tức nhận ra rằng21212211),(kkzzknkn 11211),(kznkn (3.8) 22221),(kzknnCũng nh vậy nếu f(x,y) = 0 với ( ) ( )x y< <0 0thì2121212211),()},({kkzzzzFknknfZ= (3.9)ở đây -1-211, zz biểu diễn đơn vị trễ theo hớng x và hớng y.Biến đổi 2-D Fourier của f(n1T1,n2T2) đợc cho bởi ==+=1 22211)(22112211),()},((n nnnjeTnTnfTnTnf (3.10)Có thể nhận thấy rằng phổ tần số của một tín hiệu 2-D đợc rút ra bằng cách thay 111Tjwez=, 222Tjwez=trong biến đổi z của tín hiệu.Ví dụ 3.2 Tìm biến đổi z và phổ của tín hiệu nhảy bậc đơn vị đợc xác định bằng biểu thức (2.4) trong chơng 2.Giải Biến đổi z của u n n1 1 2( , )đợc cho bởi{ } ===0 0212111 221),(n nnnzznnuZ suy ra 1211211111),(+=zzzzU251yx Phổ tần số của tín hiệu bớc nhảy có thể tính từ221122111111),(TiwTiwTiwTiweeeeU+=3.3 Các bộ lọc hai chiều có đáp ứng xung hữu hạn 2-DQuan hệ giữa đầu vào và đầu ra cho bộ lọc FIR 2-D (FIR - Finite Impulse Response) đ-ợc cho bởi = ==1122221121211 2),(),(),(NNkNNkknknxkkhnny (3.11)Trong biểu thức (3.11), h(n1,n2) là đáp ứng xung của bộ lọc và đợc định nghĩa trên một cửa sổ có kích thớc (2N1 + 1) ì (2N2 + 1) có gốc toạ độ ở trung tâm; x(n1,n2) là tín hiệu vào của bộ lọc. Nếu x(n1,n2) = 0 với ( ) ( )n n1 20 0< <, thì bằng cách lấy biến đổi z cả hai phía của biểu thức (3.11) chúng ta đợc211 2211122212121),(),(),(kkNNkNNkzzzzXkkhzzY= = = (3.12)Hàm truyền đạt của bộ lọc 2-D FIR đợc cho bởi211 221112221212121),(),(),(),(kkNNkNNkzzkkhzzXzzYzzH= = == (3.13)Các bộ lọc trên đợc định nghĩa là có kích thớc (2N1 + 1) ì (2N2 + 1). Trong hầu hết các ứng dụng chúng ta đặt N1 = N2 = N. Đáp ứng tần số của bộ lọc 2-D có thể tính từ 2221111 22211112221),(),(TkjTkjNNkNNkTjTjeekkheeH= = = (3.14)Đáp ứng xung có thể tính từ đáp ứng tần số sau khi dùng biểu thức (2.17) trong chơng 2.Các bộ lọc có đáp ứng tần với phần số thực thuần tuý đợc gọi là các bộ lọc pha zero. Trong các bộ lọc này, các pha zero đợc dịch đi một góc , cụ thể là có các giá trị âm trong phổ tần số. Một bộ lọc pha zero có đáp ứng xung là số thực thoả m nã ),(),(2121nnhnnh =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,( + )],(),()[,(),(212111k2111221112211212111 2nx(nnknxnknxkhknknxknknxkkhnnyNNNkNk+++++= == = (3.15)26 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ó),(),(),(),(21212121kkhkkhkkhkkh ===Và N1 = N2 = N. Biểu thức (3.14) có thể viết lại),00)],(),(),(),()],(),(),(),()[,(),(21212121212211221122111 1221121211 2n)x(n,h(nknxknnxnknxknnxknknxknknxknknxknknxkkhnnyNkNk+ + k)[h(0,+ + + N1=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(k1,k2) = h(k2,k1)Và ở đây biểu thức (3.16) có thể viết lại thành= ==NkNkknknxkkhnny1 1221121211 2),()[,(),( ),(),(22111221knknxknknx +++ )],(),(),(),(),(12212211122122111221knknxknknxknknxknknxknknx++++++++++ + + ),()0,0()],(),(),(),()],(),(),(),()[,(2121212121212112121nnxhnknxknnxnknxknnxknknxknknxknknxknknxkkhNk+++++++++++=+ k)[h(0,+ + + N1=k3.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 lu 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 lu 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 27 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 n1 = (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ứ n1 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 n2 = 0, 1, 2, ., (chiều rộng ảnh-1) làm các công việc sau:(1) Tính z(n2) từ = ==NNkNNkknkNwkkhnz1 2),(),()(221212(2) Lu z(n2) trong bộ đệm tại vùng n2.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+=iirowrow3. Đọ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. Lu ả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, = ==NNkNNkknkNwkkhnz1 2),(),()(221212 (3.18)28Lưu trữ tại bộ nhớ ngoài hay bộ đệm ảnh.Hàng thứ n1dịchn2Bộ đệm chuyển đổi ảnh w.(trong bộ nhớ trong)kích thước = (2N + 1) ì độ rộng của ảnh.),(),(22121212knkNwkkhzNNkNNkn===Buffer.Kích thước = 1 ì độ rộng ảnh. (0,2N)(0,0)Độ rộng của ảnhChiều dài của ảnh((độ_rộng_của_ảnh-1),0) n1Bộ đệm ảnh Để 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 n1, với n1 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 = ==NNkNNkknkNnxkkhnny1 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, = ==NNkNNkkkNzzzzXkkhzzY1 22121212121),(),(),(hay = ==NNkNNkkkNzzkkhzzzXzzY1 221212112121),(),(),( (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 Nz1.Để 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 n1 bằng N. ),()],(),(),(),()],(),(),(),()],(),(),(),(),(),(),(),([),()(2222222221222211222211222211 1122221212211 2nNwnkNwknNwnkNwknNwknkNwknkNwknkNwknkNwknkNwknkNwknkNwknkNwknkNwknkNwknkNwknkNwkkhnzkkNkNkh(0,0)+ + k)[h(0,+ + k)[h(k,+ + + + N1=kN1=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 thealgorithm described in sec.3.4. The filter typeis FIR. No assumptions are made regarding the filtercoefficients (e.g. circular symmetry). Thus, theprogram is general enough to be used with any typeof FIR filter.29 The FIR filter coefficients can be obtained using thethe Simpson's double integration program described inchapter 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);30 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 * *************/31 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 thislast 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 ->");32 [...]... phim x-quang đợc lấy ra và sau đó đợc xử lý, vì thế xử lý là ngoại tuyến trong tự nhiên Xử lý trực tuyến hay xử lý thời gian thực, hay nói cách khác, xử lý ảnh cùng với tốc độ mà chúng đợc truyền bằng camera hoặc bằng thiết bị ảnh hay một thiết bị độc lập khác Trong một số trờng hợp, xử lý thời gian thực có nghĩa là 30 khung ảnh/ giây, ở đây một khung ảnh là một ảnh hoàn chỉnh Nếu kích thớc của một ảnh. .. đợc tận dụng cho xử lý ngoại tuyến của ảnh số, ví dụ, một ảnh đợc lu trữ trên ổ cứng và sau đó đợc xử lý bằng máy tính Thời gian xử lý sẽ phụ thuộc vào tốc độ của máy tính và hiệu quả của phần mềm thực hiện Xử lý ngoại tuyến sẽ rất hữu ích trong lĩnh vực mà thời gian không phải là yêu cầu chính, nh trong tăng cờng ảnh của ảnh x-quang, một ảnh cũ, ảnh thiên văn của các ngôi sao Xử lý ngoại tuyến thờng... thời gian thực có nghĩa là 30 khung ảnh/ giây, ở đây một khung ảnh là một ảnh hoàn chỉnh Nếu kích thớc của một ảnh là 51 2 ì 51 2 điểm ảnh, thì bộ xử lý phải có khả năng xử lý 51 2 ì 51 2 ì 30 điểm ảnh/ giây = 7.86432 triệu điểm 41 ảnh/ giây trong yêu cầu để xử lý ảnh trong thời gian thực Xử lý thời gian thực không là chủ đề đề cập trong chơng này, nó sẽ đợc nói đến trong chơng 16 Mục đích của chủ đề này nhằm... cờng ảnh 3 .5 Hiển thị ảnh Nếu nh bạn cha có đợc thiết bị số hoá với bộ đệm ảnh và một màn hình đen trắng để hiển thị các ảnh mức xám, bạn vẫn có thể hiển thị những ảnh này trên màn hình VGA hoặc màn hình đa tần số Tất nhiên, bạn phải cần đến một vỉ mạch VGA với 51 2 KB bộ nhớ hoặc nhiều hơn ảnh mức xám đợc cung cấp trên đĩa kèm theo (chúng có phần mở rộng là *.IMG) hầu hết có kích thớc 256 ì 256 điểm ảnh. .. chuyển đổi một ảnh bất kỳ trên đĩa của bạn sang dạng bitmap bạn hãy sử dụng chơng trình BIN2BMP.EXE trên đĩa của bạn Chú ý rằng các ảnh có kích thớc 262,144 byte trên đĩa của bạn là các ảnh màu với độ phân giải 51 2 ì 256 điểm ảnh và 15 bit/màu, những ảnh này chúng ta sẽ sử dụng trong chơng 11 ảnh đen trắng sẽ đợc hiển thị dới Windows chỉ là những ảnh mức xám nếu nh Windows đặt ở chế độ 256 màu Bạn 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... 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 (a) 34 Hình 3.2 (a) ảnh IKRAM.IMG gốc (b) ảnh lọc thông cao của IKRAM.IMG (c) ảnh lọc thông thấp của IKRAM.IMG Bài tập 3.1 Viết chơng trình C để trung bình 2 ảnh Nếu ảnh thứ hai là kết quả của lọc ảnh thứ nhất, thì ảnh thứ hai sẽ đợc dịch dọc và/hoặc ngang so với ảnh thứ... continue; if( ((n2-k1)=image_width) ) continue; sum =(unsigned int)(*((*(w+N-k1))+(n2-k2))); sum+=(unsigned int)(*((*(w+N-k2))+(n2-k1))); sum+=(unsigned int)(*((*(w+N+k1))+(n2-k2))); sum+=(unsigned int)(*((*(w+N-k2))+(n2+k1))); sum+=(unsigned int)(*((*(w+N-k1))+(n2+k2))); sum+=(unsigned int)(*((*(w+N+k2))+(n2-k1))); sum+=(unsigned int)(*((*(w+N+k1))+(n2+k2))); sum+=(unsigned int)(*((*(w+N+k2))+(n2+k1)));... zn2+=(*((*(h+N+k1))+(N+k2)))*((float)sum); } for(k=1;k . khung ảnh/ giây, ở đây một khung ảnh là một ảnh hoàn chỉnh. Nếu kích thớc của một ảnh là 51 2 ì 51 2 điểm ảnh, thì bộ xử lý phải có khả năng xử lý 51 2 ì 51 2. x-quang đợc lấy ra và sau đó đợc xử lý, vì thế xử lý là ngoại tuyến trong tự nhiên. Xử lý trực tuyến hay xử lý thời gian thực, hay nói cách khác, xử lý