Tài liệu Giáo trình Xử lý ảnh - Chương 5: Làm nổi và tách đường biên ảnh: 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ươ...
15 trang |
Chia sẻ: hunglv | Lượt xem: 2284 | Lượt tải: 3
Bạn đang xem nội dung tài liệu Giáo trình Xử lý ảnh - Chương 5: Làm nổi và tách đường biên ảnh, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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 wc 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 wc = 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:
(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.
f(x)
a
b
c
Hình 5.1 (a) Kết quả sử dụng bộ lọc PCF với . (b) Kết quả sử dụng lọc PCF với .
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
-1
Hì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) = 3
Thuật toán trên có thể biểu diễn bằng biểu thức sau đây:
(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ử Robert
Nó bao gồm hai mặt nạ sau đây :
W1
0
-1
1
0
W2
-1
0
0
1
Đá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.
(5.4)
(5.5)
(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 q(i,j), tính theo phương nằm ngang, có thể rút ra bởi
(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:
1
0
-1
2
0
-2
1
0
-1
W1
-1
-2
-1
0
0
0
1
2
1
W2
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ừ:
(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.
1
2
0
7
6
5
4
3
E
NE
N
NW
W
SW
S
SE
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:
Kiểu 2:
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:
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:
(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 q(i,j) tính theo phương nằm ngang xác định bằng:
hướng trong phạm vi của giá trị lớn nhất của yk(i,j)
= tan-1 (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.
/* This program is for obtaining the edges using
the Sobel directional operator. */
#include
#include
#include
#include
#include
#include
#include
/* 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 ?");
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);
}
}
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)=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 ( " ");
gotoxy(1,8);
fclose(fptr); /* close input image file */
fclose(fptr1); /* close output-image file */
}
Chương trình cho các phép xử lý Kirsh cũng được trình bày ở dưới đây.
Chương trình 5.2 “KIRSH.C” Chương trình cho phát hiện đường biên ảnh dùng toán tử Kirsh.
/*Program 5.2 "KIRSH.C". Program for edge detection using the Kirsh operators.*/
/* This program is for obtaining the edges using
Kirsh Compass operator. */
#include
#include
#include
#include
#include
#include
#include
/* 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},
{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;
char file_name[14],ch;
unsigned char **w;
unsigned char *temp,tmp;
int y[8] ;
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;
}
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;
/* 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++)
{
for(j=0;j<8;j++)
y[j]=(int)0.0;
for(k1=-1; k1<=1; k1++)
for(k2=-1; k2<=1; k2++)
{
if( ((n2+k2)=image_width) ) continue;
tmp=(*((*(w+1+k1))+(n2+k2-1)));
for(j=0;j<8;j++)
y[j]+=T[j][1+k1][1+k2]*tmp;
}
for(j=0;j<8;j++)
y[j]=abs(y[j]);
zn2=y[0];
for(j=1;j<8;j++)
if(y[j]>zn2) zn2=y[j];
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(" ");
gotoxy(1,8);
fclose(fptr); /* close input image file */
fclose(fptr1); /* close output-image file*/
}
Để kiểm tra chương trình này, chúng ta dùng ảnh trong hình 4.19 chương 4. Kết quả dùng các phương pháp Sobel và Kirsh được cho trong hình 5.5 a và 5.5 b. Bạn sẽ nhận thấy rằng các xử lý của Kirsh có vẻ như cung cấp cho ta nhiều chi tiết hơn về ảnh. Cũng như thế ta nhận thấy rằng phương pháp dùng các xử lý không gian cho một kết quả tốt hơn là kỹ thuật dùng các bộ lọc thông cao. Mặc dù các mặt nạ trên dùng giả thiết là chỉ có kích thước 3 ´ 3, tuy nhiên ta có thể mở rộng để ảnh có kích thước bất kỳ nhưng thường là không quá lớn.
Bài tập 5.1
Lập một chương trình C cho phép lựa chọn sử dụng các kỹ thuật phát hiện đường biên không gian.
Bài tập 5.2
Phương pháp S. Sarker và K. L. Boyer được phát triển thành bộ lọc tách lấy đường biên tốt nhất sử dụng bộ lọc có đáp ứng xung vô hạn (IIR). Chúng ta sẽ nói về IIR trong chương 9; tuy nhiên, để hiểu được kết quả cho bởi Sarker và Boyer chúng ta chưa cần phải đọc chương 9.
1. Dựa trên kết quả phép lấy đạo hàm của chúng, phát triển bộ lọc FIR để phát hiện đường biên ảnh.
2. Sử dụng những bộ lọc này cho ảnh 4.19 của chương 4.
3. So sánh kết quả thu được qua việc tiếp cận với phương pháp được nói đến trong chương này.
Hình 5.5 (a) Kết quả thu được khi dùng xử lý Sobel trên hình 4.19. (b) Kết quả của xử lý Kirsh trên hình 4.19.
Các file đính kèm theo tài liệu này:
- CHUONG05-Làm nổi và tách đường biên ảnh.DOC