62 Chơng 5 Làm nổi và tách đờng biên ảnh 5.1 Chỉ dẫn Các kỹ thuật xử lý ả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ử lý đờ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 và 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: y yxf x yxf yxf 2 2 2 2 2 ),(),( ),( 63 2 2 2 121 ),( H (5.2) Để 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 . 64 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(w 1 ,w 2 )). ả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 -1 Hình 5.3 Kết quả của lọc ảnh trên ảnh hình 4.19. 65 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) = 3 Thuật toán trên có thể biểu diễn bằng biểu thức sau đây: 1 1 1 1 22112121 1 2 ),(),(),( k k knknIkkhnny (5.3) ở đây h(k 1 ,k 2 ) là phần tử của mẫu, với h(0,0) ở trung tâm của mẫu và I(n 1 ,n 2 ) 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ử Robert Nó 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ử lý không tuyến tính nào sau đây. y i j y i j y i j( , ) ( , ) ( , ) 1 2 2 2 (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) W 1 0 - 1 1 0 W 2 - 1 0 0 1 66 Trong đó y 1 (i,j) và y 2 (i,j) là đáp ứng rút ra từ mẫu W 1 và W 2 . 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 ),( ),( tan 4 ),( 1 2 1 jiy jiy ji (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ử lý Sobel có dạng sau: Và ả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 j y i j y i j 1 2 1 (5.8) Chú ý rằng W 1 dùng để tách lấy đờng biên dọc ảnh, còn W 2 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. 1 0 - 1 2 0 - 2 1 0 - 1 W 1 - 1 - 2 - 1 0 0 0 1 2 1 W 2 1 2 0 7 6 5 4 3 E NE N NW W SW S SE 67 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: 111 121 111 0 W 111 121 111 1 W 111 121 111 2 W 111 121 111 3 W 111 121 111 4 W 111 121 111 5 W 111 121 111 6 W 111 121 111 7 W Kiểu 2: 111 000 111 0 W 110 101 011 1 W 101 101 101 2 W 011 101 110 3 W 111 000 111 4 W 110 101 011 5 W 101 101 101 6 W 011 101 110 7 W Vớ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: 121 000 121 0 W 210 101 012 1 W 101 202 101 2 W 012 101 210 3 W 68 121 000 121 4 W 210 101 012 5 W 201 102 001 6 W 012 101 210 7 W cũ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: Trong phơng pháp xử lý 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 y 0 , y 1 là các sửa lại qua các mặt nạ W 0 , W 1 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 y k (i,j) = tan -1 y i j y i j k ( , ) ( , ) 0 (5.10) Bây giờ chúng ta sẽ kiểm tra một số phép xử lý này. Chúng ta sẽ phát triển hai chơng trình, một cho các xử lý của Sobel (dùng hai mặt nạ) và một cho các xử lý 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ử lý 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ử lý Sobel. 333 303 555 0 W 333 305 355 1 W 335 305 335 2 W 355 305 333 3 W 555 303 333 4 W 553 503 333 5 W 533 503 533 6 W 333 503 553 7 W 69 /* This program is for obtaining the edges using the 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}, {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 ?"); 70 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; } 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); } 71 } 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; /* 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; } . Kiểu 1: 11 1 12 1 11 1 0 W 11 1 12 1 11 1 1 W 11 1 12 1 11 1 2 W 11 1 12 1 11 1 3 W 11 1 12 1 11 1 4 W 11 1 12 1 11 1 5 W 11 1 12 1 11 1 6 W 11 1 12 1 11 1 7 W. 11 1 12 1 11 1 4 W 11 1 12 1 11 1 5 W 11 1 12 1 11 1 6 W 11 1 12 1 11 1 7 W Kiểu 2: 11 1 000 11 1 0 W 11 0 10 1 011 1 W 10 1 10 1 10 1 2 W 011 10 1 11 0 3 W 11 1 000 11 1 4 W 11 0 10 1 011 5 W 10 1 10 1 10 1 6 W 011 10 1 11 0 7 W. 12 1 000 12 1 0 W 210 10 1 012 1 W 10 1 202 10 1 2 W 012 10 1 210 3 W 68 12 1 000 12 1 4 W 210 10 1 012 5 W 2 01 102 0 01 6 W 012 10 1 210 7 W