Tải bản đầy đủ (.docx) (18 trang)

CHƯƠNG TRÌNH ỨNG DỤNG

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 (184.63 KB, 18 trang )

Phần 1 CHƯƠNG TRÌNH ỨNG DỤNG
1.1. Giới thiệu
Phần 1 đã trình bày khái qt về vai trị và tầm quan trọng của biên trong
quá trình xử lý ảnh. Đồng thời, phần 1 cũng đã trình bày khái niệm về biên
ảnh cũng như các phương pháp dò biên của ảnh nhị phân trong máy tính.
Để áp dụng lý thuyết đã trình bày ở phần 1, Phần này sẽ giới thiệu một
chương trình ứng dụng tìm biên của ảnh. Chương trình này áp dụng các kỹ
thuật do biên trực tiếp là kỹ thuật Gradient và Laplace. Trong kỹ thuật
Gradient, các toán tử Sobel và Prewitt được sử dụng.
Tiếp đó chương trình cũng giới thiệu một phương pháp dị biên gián tiếp
thơng qua việc phân vùng ảnh.
Chương trình được viết trên ngơn ngữ Visual C++ 6.0.
1.2. Các chức năng trong chương trình
Chương trình bao gồm các chức năng chính sau:
 Đọc một ảnh nhị phân: ảnh có thể là đen trắng, ảnh màu (16 màu hoặc
256 màu) dạng bitmap (*.bmp).
 Lưu ảnh: lưu ảnh đã biến đổi ra file
 Dò biên ảnh bao gồm các chức năng sau
o

Theo kỹ thuật Gradient: bằng cách sử dụng toán tử Sobel và
Prewitt.

o Theo kỹ thuật Laplace: sử dụng tốn tử Laplace-H2.
o Dị biên gián tiếp theo phân vùng ảnh: dò biên theo màu của ảnh.
1.3. Chi tiết các chức năng dị biên và thuật tốn
1.3.1. Dị biên theo kỹ thuật Gradient

Theo như phần lý thuyết đã trình bày, kỹ thuật Gradient dị biên theo 2
hướng x và y bằng cách sử dụng hai mặt nạ nhân chập theo hai hướng
Chương trình sử dụng hai tốn tử là Sobel và Prewitt như sau.


-1 0 1
H1 =

-1 0 1

-1 -1 -1
H2 =

-1 0 1
Ngang (hướng x)

0

0 0

1

0 1

Dọc(hướng y)

a) mặt nạ Sobel


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

-1 0 1
H1 = -2 0 2

-1 -2 -1

H2 =

Ngang (hướng x)

0 0

1

-1 0 1

0

2 1

Dọc(hướng y)

b) mặt nạ Prewitt
Giả sử Gx và Gy là 2 ma trận điểm ảnh thu được sau khi nhân chập với 2
mặt nạ theo hai hướng tương ứng. Ma trận điểm ảnh G được tính xấp xỉ theo
cơng thức sau:
G=|Gx| + |Gy|
 Thuật tốn dị biên theo phương pháp Gradient như sau:
Đầu vào: ma trận ảnh cần tìm biên:
mặt nạ I1 và I2
Đầu ra: Một ma trận ảnh (chứa các đường biên được tìm thấy).
Giải thuật
// Gradient Algorithm
For (mỗi điểm ảnh của ảnh)
if(Nếu điểm ảnh nẳm trên đường viền ảnh)
Gán giá trị các điểm ảnh trên đường viền ảnh =0 (hoặc

bằng màu nền ảnh).
else
{
- Tính xấp xỉ Gradient theo chiều x (Gx): nhân chập
với mặt nạ I1
-Tính xấp xỉ Gradient theo chiều y (Gy): nhân chập với
mặt nạ I2
-Tính giá trị điểm ảnh theo công thức xấp xỉ G:
G=|Gx|+ |Gy|
- Nếu giá trị điểm ảnh lớn hơn chỉ số màu của ảnh thì
gán giá trị ảnh là giá trị màu lớn nhất.
}
Để dễ hiểu, phần dưới đây sẽ minh hoạ thêm về giải thuật này:

Trang 2/18

2


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

Ma trận ảnh vào
Mặt nạ
a11

a12

a13

....


a1n

a21

a22

a23

.... m11

a2n
m12

m13

a31

a32

a33

....

m21

m22
a3n

m23


m31

m32

m33

..

Ma trận ảnh ra sau khi
nhân chập

..
b12

b13

....

b1n

b21

..
b22

b23

....


b2n

b31

..

b11

b32

b33

....

b3n

..

..

..

..

Trong đó:

b22=(a11*m11)+ (a12*m12)+ (a12*m13)+ (a21*m21)
(a23*m23) + (a31*m31)+ (a32*m32)+ (a33*m33).

+


(a22*m22)

+

Các giá trị nằm trên đường viền được gán =0 (hay giá trị màu nền).
(b11,b12,...b1n,b11....bn1,b1n...bnn, bn1...bnn)
Đây là công thức tính Gx và Gy
Để tính giá trị điểm ảnh đầu ra, sử dụng công thức: G=|Gx|+ |Gy|
1.3.2. Phương pháp dò biên theo kỹ thuật Laplace

Kỹ thuật Laplace dò biên theo cách tính xấp xỉ đạo hàm bậc hai dựa
trên một mặt nạ. Chương trình sử dụng mặt nạ H2 trong cách dò biên theo kỹ
thuật Laplace.
-1

Trang 3/18

-1

-1

8

-1

-1

H2=


-1
-1

-1

3


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

Gọi G là ma trận điểm thu được sau khi nhân chập ma trận điểm ảnh (của
ảnh cần tìm biên)với mặt nạ H2.
G chính là ma trận điểm ảnh chứa các đường biên cần tìm.
 Thuật tốn dò biên theo phương pháp Gradient như sau:
Đầu vào: ma trận ảnh cần tìm biên:
mặt nạ H2
Đầu ra: Một ma trận ảnh (chứa các đường biên được tìm thấy).
Giải thuật
// Laplace Algorithm
For (mỗi điểm ảnh của ảnh)
if(Nếu điểm ảnh nẳm trên đường viền ảnh)
Gán giá trị các điểm ảnh trên đường viền ảnh =0 (hoặc
bằng màu nền ảnh).
else
{
- Tính xấp xỉ Laplace G: nhân chập với mặt nạ I1
- Nếu giá trị điểm ảnh lớn hơn chỉ số màu của ảnh thì
gán giá trị ảnh là giá trị màu lớn nhất.
}
1.3.3. Phương pháp dò biên gián tiếp


Dựa trên kỹ thuật phân vùng ảnh, Phương pháp này dò biên theo sự
thay đổi mức xám màu của ảnh. Nếu những điểm ảnh nào có cùng màu hoặc
có màu khác nhưng khoảng cách màu nằm trong phạm vi cho phép, đồng
thời nằm kề nhau sẽ tạo thành một vùng.
 Định nghĩa khoảng cách màu:
Khoảng cách màu là một khái niệm để chỉ sự khác nhau về giá trị
màu của các điểm ảnh.
Giả sử a và b là 2 giá trị màu của 2 điểm ảnh. Khoảng cách màu d
của a và b được tính như sau:
d(a,b)=|Ra-Rb| + |Ga-Gb| + |Ba-Bb|
Trong đó Ra: là giá trị màu đỏ tại điểm ảnh
Ga: là giá trị màu xanh (green)tại điểm ảnh
Ba: là giá trị màu xanh da trời (blue) tại điểm ảnh.
Nếu khoảng cách màu d=0 thì 2 điểm ảnh đó có cùng màu.
Đường biên giữ các vùng chính là các đường biên cần tìm.

Trang 4/18

4


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dị biên

 Thuật tốn tìm đường biên dựa trên sự biến thiên giá trị màu
của các điểm ảnh.
Đầu vào: Ma trận điểm ảnh, khoảng cách màu tối thiểu
Đầu ra: Ma trận điểm ảnh mới (chứa các đường biên tìm thấy).
Giải thuật:
For (mỗi điểm ảnh của ảnh)

{
- Tính khoảng cách màu của điểm ảnh với các điểm ảnh lân
cận: Tính theo 8 hướng của điểm ảnh
if(Nếu có một khoảng cách màu lớn hơn khoảng cách màu
cho phép)
{
- Ghi nhận điểm ảnh này là một điểm biên mới.
}
}
1.4. Chương trình
1.4.1. Giao diện và các chức năng chính

Màn hình chính khi chạy có giao diện như sau:

Trang 5/18

5


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

1.4.2. Chức năng Gradient

 Bao gồm hai chức năng:
o Sobel
o Prewitt

 Kết quả dò biên theo kỹ thuật Gradient với tốn tử Sobel

 Kết quả dị biên theo kỹ thuật Gradient với toán tử Sobel


Trang 6/18

6


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dị biên

Nhận xét:
 Khi áp dụng hai tốn tử này cho ta cùng một kết quả tương tự nhau
 Phương pháp này tạo nên đường biên rất đậm
1.4.3. Chức năng Laplace

Chức năng này bao gồm
 chức năng Laplace-h2: sử dựng mặt nạ H2

 Kết quả dò biên theo kỹ thuật Laplace

Trang 7/18

7


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

1.4.4. Chức năng dò biên gián tiếp(Indirect Method)

 Kết quả dò biên theo phương pháp này

Trang 8/18


8


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

1.5. Một số hàm và thủ tục chính
void CDemo3Doc::OnMethodSobel()
{
// TODO: Add your command handler code here
if (image==0) return;
if (!image->IsValid()) return;
long Gx[3][3];
long Gy[3][3];
Gx[0][0] = -1; Gx[0][1] = 0; Gx[0][2] = 1;
Gx[1][0] = -1; Gx[1][1] = 0; Gx[1][2] = 1;
Gx[2][0] = -1; Gx[2][1] = 0; Gx[2][2] = 1;

//

Gy[0][0] = -1; Gy[0][1] = -1; Gy[0][2] = -1;
Gy[1][0] = 0; Gy[1][1] = 0; Gy[1][2] = 0;
Gy[2][0] = 1; Gy[2][1] = 1; Gy[2][2] = 1;
Gradient(Gx,Gy);
image->Filter(kernel,3,16,0);
UpdateAllViews(NULL);

}
Trang 9/18


9


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

bool CDemo3Doc::Gradient(long Gx[3][3], long Gy[3][3])
{
//neu khong co du lieu anh
if(!image->GetDIB()) return false;
// Gradient Algorithm
long sum;
long sumx,sumy;//gia tri tinh gx, gy
long x,y;
//long r,g,b;
long i,j,gx,gy;
//RGBQUAD c;
//CxImage tmp;
BYTE cindex;
//tmp=image->cop
CxImage tmp;
tmp.Copy (*image);
long xmin,xmax,ymin,ymax;
xmin = ymin = 0;
xmax
=(long)
image->GetWidth();
ymax=(long)image>GetHeight();
//neu anh la 8bit/1pixel
if ((image->GetBpp() ==8)||(image->GetBpp() ==4))
{

for(y=ymin; y{
for(x=xmin; x{
sumx=0;
sumy=0;
sum=0;
//kiem tra toa do x,y co nam trong anh hay khong
if (image->SelectionIsInside(x,y))
{
//xu ly cac toa do o duong vien anh
if(y==0 || y == ymax-1)
sum=0;
else if(x==0 || x==xmax-1)
sum=0;
//tinh xap xi gradient
else
{
Trang 10/18

10


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

//tinh theo chieu x
for( i=-1; i<=1 ; i++)
for(j=-1; j<=1; j++)
{
//lay gia tri mau

CString s1;
cindex=image>GetPixelIndex(x+i,y+j);
gx=Gx[i+1][j+1];
sumx=sumx+ (cindex* gx);
}
//tinh theo chieu y
for( i=-1; i<=1 ; i++)
for(j=-1; j<=1; j++)
{
//lay gia tri mau
cindex=image>GetPixelIndex(x+i,y+j);
gy=Gy[i+1][j+1];
sumy=sumy+ (cindex* gy);
}
//lay xap xi
sum=abs(sumx)+abs(sumy);
sum=(BYTE)min(255, sum);
}
//AfxMessageBox(sum);
tmp.SetPixelIndex(x,y,255-(BYTE)sum);
}
}
}
}
//chuyen doi anh
image->Transfer(tmp);
return true;
}
CxImage CDemo3Doc::LamManhBien(CxImage *img)
{

Trang 11/18

11


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

if(!img->GetDIB()) return false;
long x,y;
//CxImage tmp;
//tmp.Copy (*img);
long xmin,xmax,ymin,ymax;
BYTE preindex,posindex,index;
xmin = ymin = 0;
xmax =(long) img->GetWidth(); ymax=(long)img->GetHeight();
//neu anh la 8bit/1pixel
if ((image->GetBpp() ==8) || (image->GetBpp() ==4))
{
for(y=ymin; y{
for(x=xmin; x{
preindex=img->GetPixelIndex(x-1,y-1) ;
index=img->GetPixelIndex(x,y) ;
posindex=img->GetPixelIndex(x+1,y+1) ;
//neu index tai diem x,y khong lon hon tai diem x-1,y-1
va x+1,y+1 thi loai bo
if ((index<=preindex || index<=posindex))
img->SetPixelColor( x,y,RGB(0,0,0)); //dat mau
den

}
}
}
return *img;
}
void CDemo3Doc::OnMethodPrewitt()
{
// TODO: Add your command handler code here
// TODO: Add your command handler code here
if (image==0) return;
if (!image->IsValid()) return;
Trang 12/18

12


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

long Gx[3][3];
long Gy[3][3];
Gx[0][0] = -1; Gx[0][1] = 0; Gx[0][2] = 1;
Gx[1][0] = -2; Gx[1][1] = 0; Gx[1][2] = 2;
Gx[2][0] = -1; Gx[2][1] = 0; Gx[2][2] = 1;
/* 3x3 GY Sobel mask. Ref: www.cee.hw.ac.uk/hipr/html/sobel.html */
Gy[0][0] = -1; Gy[0][1]=-2; Gy[0][2] =-1;
Gy[1][0] = 0; Gy[1][1] = 0; Gy[1][2] = 0;
Gy[2][0] = 1; Gy[2][1] = 2; Gy[2][2] = 1;
if(Gradient(Gx,Gy)==false) AfxMessageBox("Khong co du lieu anh");;
UpdateAllViews(NULL);
}

bool CDemo3Doc::Laplace(long G[3][3])
{
//neu khong co du lieu anh
if(!image->GetDIB()) return false;

//

// Gradient Algorithm
long sum;
long sumx;
long x,y;
//long r,g,b;
long i,j,g;
//RGBQUAD c;
//CxImage tmp;
BYTE cindex;
CxImage tmp;
tmp.Copy (*image);
long xmin,xmax,ymin,ymax;
xmin = ymin = 0;
xmax =(long) image->GetWidth(); ymax=(long)image->GetHeight();
//neu anh la 8bit/1pixel
if ((image->GetBpp() ==8) || (image->GetBpp() ==4))
{
for(y=ymin; y{
for(x=xmin; x
Trang 13/18


13


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

{
sum=0;
//kiem tra toa do x,y co nam trong anh hay khong
if (image->SelectionIsInside(x,y))
{
//xu ly cac toa do o duong vien anh
if(y==0 || y == ymax-1)
sum=0;
else if(x==0 || x==xmax-1)
sum=0;
//tinh xap xi laplace
else
{
//tinh theo chieu x
for( i=-1; i<=1 ; i++)
for(j=-1; j<=1; j++)
{
//lay gia tri mau
cindex=image>GetPixelIndex(x+i,y+j);
//lay gia tri ma tran Gx tuong
ung
//gx=Gx[i+1 + 3*[j+1)];
//gx=Gx[j+1 + 3*[i+1)];
g=G[i+1][j+1];
sum=sum+ (cindex* g);

sum=min(255,sum);

//

}
sum=(BYTE)min(255, 255-sum);
}
//AfxMessageBox(sum);
tmp.SetPixelIndex(x,y,(BYTE)sum);
//tmp.SetPixelIndex(x,y,0);
}
}
}
//

}
//chuyen doi anh
image->Transfer(LamManhBien(&tmp));

Trang 14/18

14


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

image->Transfer(tmp);
return true;
}
void CDemo3Doc::OnMethodLaplace()

{
// TODO: Add your command handler code here
if (image==0) return;
if (!image->IsValid()) return;
long Gx[3][3];
Gx[0][0] = -1; Gx[0][1] =-1; Gx[0][2]= -1;
Gx[1][0] = -1; Gx[1][1] = 8; Gx[1][2]= -1;
Gx[2][0] = -1; Gx[2][1] =-1; Gx[2][2]= -1;
if(Laplace(Gx)==false) AfxMessageBox("Khong co du lieu anh");
UpdateAllViews(NULL);
}
bool CDemo3Doc::DoBien()
{
//neu khong co du lieu anh
if(!image->GetDIB()) return false;
//
//

//
//

long sum;
long sumx;
long x,y;
long d1,d2,d3,d4,d5,d6,d7,d8;
long r,g,b;
long i,j;
//RGBQUAD c;
//CxImage tmp;
//BYTE cindex;

RGBQUAD c,c1,c2,c3,c4,c5,c6,c7,c8;
RGBQUAD bc;
int dis_min=0;
//CoArray
CxImage tmp;
tmp.Copy (*image);

Trang 15/18

15


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

long xmin,xmax,ymin,ymax;
xmin = ymin = 0;
xmax =(long) image->GetWidth(); ymax=(long)image->GetHeight();
for(y=ymin; y{
for(x=xmin; x{
//dat mau trang cho anh tam
tmp.SetPixelColor(x,y,RGB(255,255,255));
}
}
//bc=image->GetPixelIndex (0,0);
//neu anh la 8bit/1pixel
if ((image->GetBpp() ==8) || (image->GetBpp() ==4))
{
for(y=ymin; y

{
for(x=xmin; x{
//dat mau den cho anh tam
//tmp.SetPixelColor(x,y,RGB(0,0,0));
c=image->GetPixelColor (x,y);
//
if(image->GetPixelIndex (x,y)==image->GetPixelIndex (0,0))
{

-c1.rgbGreen)+
-c2.rgbGreen)+
-c3.rgbGreen)+
-c4.rgbGreen)+
Trang 16/18

c1=image->GetPixelColor(x-1,y);
c2=image->GetPixelColor(x+1,y);
c3=image->GetPixelColor(x,y-1);
c4=image->GetPixelColor(x,y+1);
c5=image->GetPixelColor(x-1,y-1);
c6=image->GetPixelColor(x+1,y+1);
c7=image->GetPixelColor(x+1,y-1);
c8=image->GetPixelColor(x-1,y+1);
//tinh khoang cach giua hai mau
d1=abs(c.rgbRed-c1.rgbRed)+abs(c.rgbGreen
abs(c.rgbBlue -c1.rgbBlue );
d2=abs(c.rgbRed-c2.rgbRed)+abs(c.rgbGreen
abs(c.rgbBlue -c2.rgbBlue );
d3=abs(c.rgbRed-c3.rgbRed)+abs(c.rgbGreen

abs(c.rgbBlue -c3.rgbBlue );
d4=abs(c.rgbRed-c4.rgbRed)+abs(c.rgbGreen
abs(c.rgbBlue -c4.rgbBlue );
16


Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

-c5.rgbGreen)+
-c6.rgbGreen)+
-c7.rgbGreen)+
-c8.rgbGreen)+

d5=abs(c.rgbRed-c5.rgbRed)+abs(c.rgbGreen
abs(c.rgbBlue -c5.rgbBlue );
d6=abs(c.rgbRed-c6.rgbRed)+abs(c.rgbGreen
abs(c.rgbBlue -c6.rgbBlue );
d7=abs(c.rgbRed-c7.rgbRed)+abs(c.rgbGreen
abs(c.rgbBlue -c7.rgbBlue );
d8=abs(c.rgbRed-c8.rgbRed)+abs(c.rgbGreen
abs(c.rgbBlue -c8.rgbBlue );

if(d1>dis_min || d2>dis_min || d3>dis_min
d4>dis_min || d5>dis_min ||d6>dis_min||d7>dis_min ||d8>dis_min)
{

||

//dat mau den tai cac diem bien
bc=tmp.GetPixelColor(x,y-1);

//neu diem truoc la diem bien
if(bc.rgbBlue==0 ||bc.rgbGreen ==0 || bc.rgbRed ==0 )
{
tmp.SetPixelColor(x,y,RGB(0,0,0));
}
else
{
tmp.SetPixelColor(x,y,RGB(0,0,0));
}
//

}
}
}

}
}
image->Transfer(tmp);
return true;
}
void CDemo3Doc::OnIndirectMethod()
{
// TODO: Add your command handler code here
DoBien();
UpdateAllViews(NULL);
}
Trang 17/18

17



Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên

Trang 18/18

18



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×