1. Trang chủ
  2. » Công Nghệ Thông Tin

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

18 679 2
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Chương Trình Ứng Dụng
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Xử Lý Ảnh
Thể loại Tiểu luận
Định dạng
Số trang 18
Dung lượng 137,8 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

 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.. Ma trận điểm ảnh G được tính xấp xỉ

Trang 1

1.1 Giới thiệu

Phần 1 đã trình bày khái quát 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 toá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 toá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 toán tử là Sobel và Prewitt như sau

H1 =

-1 0 1

H2 =

-1 -1 -1 -1 0 1 0 0 0 -1 0 1 1 0 1 Ngang (hướng x) Dọc(hướng y)

Trang 2

a) mặt nạ Sobel

H1 =

-1 0 1

H2 =

-1 -2 -1 -2 0 2 0 0 0 -1 0 1 1 2 1 Ngang (hướng x) 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 toá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

}

Trang 3

Để dễ hiểu, phần dưới đây sẽ minh hoạ thêm về giải thuật này:

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

Trong đó:

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

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 -1 -1

Trang 4

-1 -1 -1 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 toá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

Trang 5

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

 Thuật toá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 6

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 toán tử Sobel

Trang 7

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

Nhận xét:

 Khi áp dụng hai toán tử này cho ta cùng một kết quả tương tự nhau

Trang 8

 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

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 9

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 10

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<ymax; y++) {

for(x=xmin; x<xmax; 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 11

//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 12

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<ymax; y++) {

for(x=xmin; x<xmax; 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 13

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<ymax; y++) {

for(x=xmin; x<xmax; x++)

Trang 14

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=(BYTE)min(255, 255-sum);

} //AfxMessageBox(sum);

tmp.SetPixelIndex(x,y,(BYTE)sum);

//tmp.SetPixelIndex(x,y,0);

} }

} }

//chuyen doi anh

Trang 15

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 16

long xmin,xmax,ymin,ymax;

xmin = ymin = 0;

xmax =(long) image->GetWidth(); ymax=(long)image->GetHeight(); for(y=ymin; y<ymax; y++)

{

for(x=xmin; x<xmax; 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<ymax; y++) {

for(x=xmin; x<xmax; 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=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 -c1.rgbGreen)+ abs(c.rgbBlue -c1.rgbBlue );

d2=abs(c.rgbRed-c2.rgbRed)+abs(c.rgbGreen -c2.rgbGreen)+ abs(c.rgbBlue -c2.rgbBlue );

d3=abs(c.rgbRed-c3.rgbRed)+abs(c.rgbGreen -c3.rgbGreen)+ abs(c.rgbBlue -c3.rgbBlue );

d4=abs(c.rgbRed-c4.rgbRed)+abs(c.rgbGreen

Trang 17

-d5=abs(c.rgbRed-c5.rgbRed)+abs(c.rgbGreen -c5.rgbGreen)+ abs(c.rgbBlue -c5.rgbBlue );

d6=abs(c.rgbRed-c6.rgbRed)+abs(c.rgbGreen -c6.rgbGreen)+ abs(c.rgbBlue -c6.rgbBlue );

d7=abs(c.rgbRed-c7.rgbRed)+abs(c.rgbGreen -c7.rgbGreen)+ abs(c.rgbBlue -c7.rgbBlue );

d8=abs(c.rgbRed-c8.rgbRed)+abs(c.rgbGreen -c8.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);

}

Ngày đăng: 01/11/2013, 17:20

HÌNH ẢNH LIÊN QUAN

Màn hình chính khi chạy có giao diện như sau: - CHƯƠNG TRÌNH ỨNG DỤNG
n hình chính khi chạy có giao diện như sau: (Trang 5)

TỪ KHÓA LIÊN QUAN

w