Xử lý ảnh - Chương 8

16 882 11
Tài liệu đã được kiểm tra trùng lặp
 Xử lý ảnh - Chương 8

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Xử lý ảnh

Chơng 5Làm nổi và tách đờng biên ảnh5.1 Chỉ dẫn Các kỹ thuật xử ảnh đều quan tâm đến việc làm nổi hoặc tách lấy đ-ờng biên ảnh. Đờng biên trong một ảnh đen trắng đợc định nghĩa là các đoạn rời rạc hoặc là thay đổi đột ngột của cờng độ mức xám. Sự thay đổi này chứa các thông tin về ảnh, và phần đóng góp của chúng trong phổ ảnh sẽ tìm thấy cuối miền tần số cao. Một đờng biên ảnh, trong trờng hợp tổng quát có thể trải theo bất kỳ hớng nào, và có thể biến thiên về cờng độ sáng. Trong chơng này, chúng ta sẽ lấy ra đờng biên ảnh bằng đặc tuyến tần số của chúng. Ta sử dụng bộ lọc FIR đợc thiết kế nh bộ lọc thông cao đối xứng vòng tròn vào công việc này. Sau đó, ta sẽ đa ra một số phép xử đ-ờng biên lấy từ đặc tuyến không gian của đờng biên ảnh.5.2 Làm nổi đờng biên ảnh qua bộ lọc FIR Vì đờng biên ảnh chiếm ở dải tần số cao trong phổ của ảnh, nên ta có thể làm nổi hoặc tách đờng biên ảnh qua bộ lọc thông cao. Dùng cho chức năng này, ta có thể dùng bộ lọc tơng phản pha có điểm cắt tần số đủ cao để làm nổi đờng biên ảnh và làm mờ các chi tiết khác của ảnh có tần số thấp. Vấn đề đặt ra là chúng ta tìm ra điểm cắt tần số này nh thế nào. Điểm này đợc tìm ra bằng phơng pháp thử nghiệm và điều chỉnh dần dần. Ví dụ, ta có thể sử dụng ảnh đã qua bộ lọc trung vị ở hình 4.19 trong chơng 4, ảnh này thu đợc khi sử dụng lợc đồ mức xám lọc trung vị trên ảnh "ISLAM.IMG" có trên đĩa đi kèm theo. Hình 5.1a và hình 5.1b cho kết quả dùng PCF thiết kế nh lọc FIR kích thớc 5 ì 5 với các điểm cắt c là 1.7 và 2.0. Các kết quả cho thấy là trong trờng hợp này đờng biên ảnh nổi trội với c = 2.0 .Một phơng pháp khác hay dùng để làm nổi đờng biên ảnh là dùng bộ lọc Laplace, định nghĩa nh sau:(5.1)ở đây f(x,y) là hàm cờng độ của ảnh. Đặc tính tần số của Laplace đợc định nghĩa nh sau:222121),(+=H(5.2)62yyxfxyxfyxf22222),(),(),(+= Để hiểu hoạt động của phơng pháp Laplace trong việc trích ra đờng biên, xem sơ đồ ví dụ hình 5.2. Chúng là sự đơn giản hoá sờn âm và sờn d-ơng đờng biên. Hình 5.1 (a) Kết quả sử dụng bộ lọc PCF với 7.1=c. (b) Kết quả sử dụng lọc PCF với 0.2=c.63f(x) a 222121),(+=H b 222121),(+=H c Hình 5.2 Đạo hàm bậc nhất và bậc hai của đờng biên.Rõ ràng là đạo hàm bậc hai có thể dùng để phát hiện đờng biên ảnh. Thông thờng, các điểm cắt zero của đạo hàm bậc hai là nơi có đờng biên ảnh. Cần phải nhớ rằng đạo hàm của một hàm hai biến tại bất kỳ điểm nào cũng phụ thuộc vào hớng lấy đạo hàm. Các bộ lọc FIR có thể dùng xấp xỉ một Laplace bởi dùng hàm cho bởi biểu thức (5.2) nh hàm lọc trong chơng 2, chơng trình 2.1 (hàm H(w1,w2)). ảnh trong hình 5.3 cho ta kết quả dùng Laplace thiết kế nh một bộ lọc FIR 9 ì 9 trên ảnh cho trong hình 4.19.Bài tập 5.1 Viết một chơng trình dùng để tách đờng biên ảnh dùng:1. Bộ lọc thông cao tơng phản pha dùng nh một bộ lọc FIR.2. Một hàm Laplace dùng nh một bộ lọc FIR.5.3 Tách đờng biên ảnh qua cách tiếp cận khoảng cách Dùng đặc tuyến khoảng cách đờng biên, chúng ta có thể đa ra một số cách tiếp cận để phát hiện ra đờng biên. Để cung cấp cơ sở về kỹ thuật này, chúng ta sẽ bắt đầu xem xét mẫu sau đây:-1 2 -1-1 2 -1-1 2 -1Hình 5.3 Kết quả của lọc ảnh trên ảnh hình 4.19.Giả sử rằng, trong trờng hợp này, ảnh chỉ có hai mức xám là 0 và 1, và một đờng biên dọc ảnh có chiều dài tối thiểu là 3 điểm ở một nơi nào đó trên ảnh. Để tách lấy đờng biên dọc ảnh thì chúng ta phải chồng lên và quét mẫu lên trên bề mặt ảnh. Tại bất kỳ vùng nào chúng ta nhân phần tử chứa trong mẫu với với mức xám tơng ứng đợc che bởi mỗi phần tử của mẫu, sau đó tính tổng các kết quả. Bởi vì tổng của tất cả các phần tử của mẫu bằng không, kết quả sẽ là không cho nền và khác không cho các nơi khác. Nếu cột giữa của mẫu trùng với một đờng biên có ít nhất ba điểm theo chiều cao, cột giữa và phải che các giá trị 1, cột trái che các giá trị 0, chúng ta có giá trị là 3, theo (-1* 0) + (-1* 0) + (-1* 0) + 2*1 + 2* 1 + 2* 1 + (-1* 1) + (-1* 1) + (-1* 1) = 364 Thuật toán trên có thể biểu diễn bằng biểu thức sau đây: = =++=1111221121211 2),(),(),(k kknknIkkhnny(5.3)ở đây h(k1,k2) là phần tử của mẫu, với h(0,0) ở trung tâm của mẫu và I(n1,n2) là mức cờng độ sáng của ảnh. Biểu thức (5.3) biểu thị cho tơng quan chéo giữa mẫu với ảnh. Mặc dù thuật toán này chỉ áp dụng cho ảnh nhị phân, một ảnh chỉ có hai mức xám, nó cũng có thể áp dụng trong trờng hợp tổng quát cho ảnh có nhiều mức xám nh chúng ta sẽ xem xét sau này trên ảnh thật. Một số các mẫu thờng đợc gọi là một đờng biên hoặc là một mặt nạ xử lý, đã đợc cho sẵn trong tài liệu. Các loại mặt nạ hay dùng nhất sẽ đợc đề cập sau. 5.3.1 Toán tử RobertNó bao gồm hai mặt nạ sau đây : Đáp ứng từ tất cả mặt nạ này đợc tính từ biểu thức (5.3). Chiều dài đờng biên ảnh có thể rút ra bằng cách dùng bất kỳ phép xử không tuyến tính nào sau đây. y i j y i j y i j( , ) ( , ) ( , )= +1222(5.4) { }y i j y i j y i j( , ) max ( , ) , ( , )=1 2 (5.5) { }y i j y i j y i j( , ) ( , ) ( , )= +1 2 (5.6)Trong đó y1(i,j) và y2(i,j) là đáp ứng rút ra từ mẫu W1 và W2. Hai biểu thức cuối cùng đợc dùng thờng xuyên nhất. Hớng của đờng biên (i,j), tính theo phơng nằm ngang, có thể rút ra bởi),(),(tan4),(121jiyjiyji= (5.7) Các phần tử trong mặt nạ gọi là các trọng số.5.3.2 Toán tử Sobel Phơng pháp Sobel đợc thiết kế để xấp xỉ hàm gradient rời rạc. Mặt nạ xử Sobel có dạng sau:6510-120-210-1W1-1-2-1000121W2 W1 0-110 W2 -1001 ảnh chiều dài đờng biên tính ra từ tính toán dùng biểu thức (5.4), 5.5) hoặc (5.6). Hớng của đờng biên tính từ: ( . ) tan( , )( , )i jy i jy i j=121 (5.8)Chú ý rằng W1 dùng để tách lấy đờng biên dọc ảnh, còn W2 dùng để tách lấy đờng biên ngang của ảnh.5.3.3 Các mặt nạ gradient khép kín Chúng đợc phát triển dựa trên sự đánh giá tất cả các hớng có thể của một đờng biên ảnh trong một ảnh rời rạc. Bởi vậy thay vì chỉ áp dụng hai mặt nạ nh hai phơng pháp trớc, tám mặt nạ đã đợc dùng, mỗi cái cung cấp một cạnh đờng biên dọc theo một trong tám hớng có thể của vòng (xem hình 5.4). Bốn kiểu khác nhau của các mặt nạ của phơng pháp này cho ở phía dới. Chúng là sự phát triển dựa trên mô hình dữ liệu cơ sở cho đờng biên trong ảnh.Hình 5.4 Các hớng xử lý.Các toán tử Prewitt. Có hai kiểu toán tử sau: Kiểu 1: 6612076 543ENEN NWWSW SSE =1111211110W=1111211111W=1111211112W=1111211113W =1111211114W=1111211115W=1111211116W=1111211117W Kiểu 2: =1110001110W=1101010111W=1011011012W=0111011103W =1110001114W=1101010115W=1011011016W=0111011107WVới kiểu thứ 2 bạn chỉ cần bốn mặt nạ đầu tiên vì tính đối xứng giữa chúng với bốn mặt nạ cuối cùng.Toán tử vòng Sobel. Toán tử này đợc tính theo tám mặt nạ sau:=1210001210W=2101010121W=1012021012W=0121012103W=1210001214W=2101010125W=2011020016W=0121012107Wcũng do tính đối xứng mà bạn chỉ cần dùng bốn mặt nạ đầu tiên . Toán tử vòng Kirsh. Các toán này đợc xem nh là các toán tử thuần nhất. Nó tạo ra một sự thay đổi nhỏ trong gradient và tạo ra các sự so sánh lần lợt nh các phơng pháp trớc đây. Tám mặt nạ này đợc mô tả nh sau: 67=3333035550W=3333053551W=3353053352W=3553053333W=5553033334W=5535033335W=5335035336W=3335035537W Trong phơng pháp xử tuần hoàn thì các đờng biên ảnh có thể phát hiện ra theo:y i j y i j y i j( , ) max{| ( , ), .,| ( , )|}=0 7 (5.9)ở đây y0, y1 là các sửa lại qua các mặt nạ W0, W1 trên ảnh. Góc (i,j) tính theo phơng nằm ngang xác định bằng: ( , )i j =hớng trong phạm vi của giá trị lớn nhất của yk(i,j)= tan-1 y i jy i jk( , )( , )0 (5.10)Bây giờ chúng ta sẽ kiểm tra một số phép xử này. Chúng ta sẽ phát triển hai chơng trình, một cho các xử của Sobel (dùng hai mặt nạ) và một cho các xử của Kirsh. Các bớc phát triển cho chơng trình này tơng tự nh các bớc phát triển cho chơng trình lọc FIR. Chơng trình gốc của xử Sobel đợc cho ở dới đây:Chơng trình 5.1 SOBEL.C Ch ơng trình để rút ra chiều dài đờng biên ảnh dùng xử Sobel. /* This program is for obtaining the edges usingthe Sobel directional operator. */#include <stdio.h>#include <stdlib.h>#include <math.h>#include <alloc.h>#include <conio.h>#include <io.h>#include <ctype.h>/* Sobel masks. */int S1[3][3]={{1, 0, -1}, {2, 0, -2}, {1, 0, -1}};int S2[3][3]={{ -1, -2, -1},68 {0, 0, 0}, {1, 2 , 1 }};void main(){int i,j,n1,n2,image_width, image_length,k1,k2,ind;char file_name[14],ch;unsigned char **w;unsigned char *temp,tmp;int y1, y2;float nsq;unsigned int zn2;FILE *fptr, *fptr1;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;69 }printf("\nEnter file name for filtered image ->");scanf("%s",file_name);ind=access(file_name,0);while(!ind) { gotoxy(1,6); 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,6);printf(" ");gotoxy(1,5);printf(" ");gotoxy(1,5);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");/* Allocating memory for Image Transfer Buffer, w. */w=(unsigned char **)malloc(3*sizeof(char *));for(i=0;i<3;i++)*(w+i)=(char *)calloc(image_width,sizeof(char));/* Clear Image Transfer Buffer. */for(i=0;i<3;i++) for(j=0;j<image_width;j++) *((*(w+i))+j)=(unsigned char)0;70 /* Algorithm */for(n1=0; n1<image_length;n1++) { gotoxy(1,9); printf (" Transfered 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+2))+j) = (unsigned char)ch; }for(n2=0; n2<image_width; n2++) { y1=y2=(int)0; for(k1=-1; k1<=1; k1++) for(k2=-1; k2<=1; k2++) { if( ((n2+k2)<0) || ((n2+k2-1)>=image_width) ) continue; tmp=(*((*(w+1+k1))+(n2+k2-1))); y1+=S1[1+k1][1+k2]*tmp; y2+=S2[1+k1][1+k2]*tmp; } y1=abs(y1); y2=abs(y2); zn2=(y1>y2)?y1:y2; putc(zn2,fptr1);/* The buffer is imPlicit in this last statement. */ }/* Shift rows of w */ temp=*w; for(j=0; j<2; j++)*(w+j)=*(w+j+1); *(w+2)=temp; } gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs ( " ");71 [...]... /* Kirsh operators */ int T [8] [3][3]={ { {5,5,5}, {-3 ,0 ,-3 }, {-3 ,-3 ,-3 },}, {{5,5 ,-3 }, {5,0 ,-3 }, {-3 ,-3 ,-3 }, }, {{5 ,-3 ,-3 }, {5,0 ,-3 }, {5 ,-3 ,-3 },}, { {-3 ,-3 ,-3 }, {5,0 ,-3 }, {5,5 ,-3 },}, { {-3 ,-3 ,-3 }, {-3 ,0 ,-3 }, 72 {5,5,5},}, { {-3 ,-3 ,-3 }, {-3 ,0,5}, {-3 ,5,5},}, { {-3 ,5,5}, {-3 ,0,5}, {-3 ,-3 ,5},}, { {-3 ,5,5}, {-3 ,0,5}, {-3 ,-3 ,-3 },} }; void main() { int i,j,n1,n2,image_width, image_length,k1,k2,ind;... line %-4 d to image transfer buffer ",n1); /* Transfer row n2 of the image to the last row of w */ for(j=0;j . { {-3 ,-3 ,-3 }, {5,0 ,-3 }, {5,5 ,-3 },}, { {-3 ,-3 ,-3 }, {-3 ,0 ,-3 },72 {5,5,5},}, { {-3 ,-3 ,-3 }, {-3 ,0,5}, {-3 ,5,5},}, { {-3 ,5,5}, {-3 ,0,5}, {-3 ,-3 ,5},},. */int T [8] [3][3]={ { {5,5,5}, {-3 ,0 ,-3 }, {-3 ,-3 ,-3 },}, {{5,5 ,-3 }, {5,0 ,-3 }, {-3 ,-3 ,-3 }, }, {{5 ,-3 ,-3 }, {5,0 ,-3 }, {5 ,-3 ,-3 },},

Ngày đăng: 14/11/2012, 14:45

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

Tài liệu liên quan