Tải bản đầy đủ (.doc) (12 trang)

Làm nổi và tách đường biên ảnh

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (374.45 KB, 12 trang )

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:
2
2
2
121
),(

+=H
(5.2)
62
y
yxf
x
yxf
yxf
2
2
2
2
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

.
Hình 5.2 Đạo hàm bậc nhất và bậc hai của đờng biên.
63
f(x)
a
2
2
2
121
),(

+=H
b
2
2
2
121
),(

+=H

c
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.
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.
64
W
1

-11
W
2

-11

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)
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.
65
1-12-21-1
W
1
-1-2-1121
W
2
1
2

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:













=
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











=
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:

66










=
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
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.
/* 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.");
67
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. */
68
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;
}
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 <stdio.h>
69
#include <stdlib.h>
#include <math.h>
#include <alloc.h>
#include <conio.h>
#include <io.h>
#include <ctype.h>
/* 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);
7
}
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;
71
/* 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)<0) || ((n2+k2-1)>=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ỳ
nhng thờng là không quá lớn.
Bài tập 5.1
72
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 cha
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.
73

×