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

Báo cáo bài thực hành xử lý ảnh

11 2,4K 0

Đ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

Định dạng
Số trang 11
Dung lượng 116 KB

Nội dung

Báo cáo bài thực hành xử lý ảnh

Trang 1

BÁO CÁO BÀI THỰC HÀNH

MÔN: XỬ LÝ ẢNH LỚP: K10T3

KHOA CÔNG NGHỆ

******************************

ĐẠI HỌC QUỐC GIA HÀ NỘI

Hµ Néi 6 - 2004

1 Đỗ Văn Bình

2 Phạm Hùng Thế

3 Thạch Hoàng Việt

Trang 2

BÁO CÁO BÀI THỰC HÀNH MÔN XỬ LÝ ẢNH

Tên bài tập

XÂY DỰNG MỘT SỐ THUẬT TOÁN SƠ CẤP TRONG XỬ LÝ ẢNH

1 Chức năng của chương trình

Xuất phát từ ý tưởng xây dựng một chương trình xử lý các phép toán cơ bản trong xử lý ảnh Chương trình này chỉ là bước khởi đầu cho một sự tích hợp tất

cả các thuật toán cơ sở vào trong một chương trình, đây sẽ là một trong những chương trình giúp người sử dụng hiểu rõ hơn về một số thuạt toán cơ sở trong

xử lý ảnh

Trong khuôn khổ của một bài tập thực hành, ở đây xin được trình bày 4 thuật toán cơ sở bao gồm: Giãn nở ảnh (làm béo), Ăn mòn ảnh (làm gầy), Xoay ảnh

và tìm xương

Giao diện toàn cảnh của chương trình sẽ được hiển thị như hình dưới đây:

Hình 1 Dưới đây sẽ trình bày chi tiết các thuật toán trên

Trang 3

1.1 Load ảnh và lưu ảnh sau khi xử lý

Load ảnh: Đây là chức năng đầu tiên của chương trình cho phép load một ảnh

bitmap 256 mầu để xử lý

Lưu ảnh: Là chức năng cho phép lưu trữ ảnh sau khi xử lý dưới dang 1 tệp

tin

1.2 Sự giãn nở ảnh (Dilation)

Ảnh ở Hình 1 là ảnh trước khi xử lý (Ảnh gốc, ảnh tiền xử lý) Sau khi thực hiện chức năng giãn nở (Dilation) ta thu được ảnh như hình dưới đây:

Hình 2: Ảnh thu được sau khi thực hiện chức năng giãn nở lần 2

Chú y: Số lần giãn nở trong một chừng mực nào đó có thể coi là không hạn chế

1.3 Sự ăn mòn ảnh (Erosion)

Ảnh ở Hình 1 là ảnh trước khi xử lý (Ảnh gốc, ảnh tiền xử lý) Sau khi thực hiện chức năng ăn mòn ảnh (Erosion) ta thu được ảnh như hình dưới đây:

Trang 4

Hình 3: Ảnh thu được sau khi thực hiện chức năng ăn mòn lần 2

Chú y: Số lần thực hiện chức năng ăn mòn trong một chừng mực nào đó có thể coi là không hạn chế (Cho tới khi ảnh bị ăn mòn hết).

1.4 Xoay ảnh (Rotation)

Ảnh ở Hình 1 là ảnh trước khi xử lý (Ảnh gốc, ảnh tiền xử lý) Bây giờ chúng

ta hãy thực hiện chức năng xoay ảnh Người sử dụng phải nhập vào giá trị của góc xoay (Dưới dạng radian) Ví dụ sau đây chúng ta hãy nhập vào giá trị góc xoay là 0.3 như hình dưới đây:

Sau khi bấm nút lệnh OK ta thu được ảnh như hình dưới đây:

Trang 5

Hình 4: Ảnh thu được sau khi thực hiện chức năng xoay ảnh với góc 0.3 radian

1.5 Tìm xương (Bone finding)

Ảnh ở Hình 1 là ảnh trước khi xử lý (Ảnh gốc, ảnh tiền xử lý) Sau khi thực hiện chức năng tìm xương (Bone finding) ta thu được ảnh như hình dưới đây:

Trang 6

Hình 5: Ảnh thu được sau khi thực hiện chức năng Bone finding.

2 Các thuật toán áp dụng trong chương trình

 Thuật toán làm giãn nở ảnh

 Thuật toán ăn mòn ảnh

 Thuật toán xoay ảnh

 Thuật toán tìm xương

3 Một số đoạn code áp dụng các thuật toán trên

3.1 Thủ tục làm giãn nở ảnh

/////////////////////////////////////////////////////////////////////////////

//void IMAGE::Dilation(): lam beo chu

// mot diem nhan thanh 8 diem xung quanh /////////////////////////////////////////////////////////////////////////////

void IMAGE::Dilation(int M){

int i,j,k,z;

char TAM=2;

char*pCot,*pPic,*pDong,*pCot1,*pDong1;

int n,m2;

pPic=(char*)GlobalLock(hPic);

Trang 7

n=M+M*MaxX;

for(pDong=pPic,i=0;i<MaxY;i++,pDong+=MaxX)

for(pCot=pDong,j=0;j<max;j++,pCot++){

if(pCot[0]==TAM){

pCot[0]=DEN;

continue;

}//if if(j<M||i<M||j>=max-M||i>=MaxY-M) continue;

if(pCot[0]==DEN){

pDong1=pCot-n;

for(k=0;k<m2;k++,pDong1+=MaxX) for(pCot1=pDong1,z=0;z<m2;z++,pCot1++){

if(pCot1[0]!=TRANG) continue; if(pCot1<pCot) pCot1[0]=DEN; else pCot1[0]=TAM;

}//for }//if

}//for

GlobalUnlock(hPic);

return;

}//

3.2 Thủ tục làm ăn mòn ảnh

/////////////////////////////////////////////////////////////////////////////

//void IMAGE::Erosion(): lam gay chu

/////////////////////////////////////////////////////////////////////////////

void IMAGE::Erosion(int M){

int i,j,k,z;

char TAM=2;

char*pCot,*pPic,*pDong,*pCot1,*pDong1;

int n,m2;

pPic=(char*)GlobalLock(hPic);

m2=M*2+1;

n=M+M*MaxX;

for(pDong=pPic,i=0;i<MaxY;i++,pDong+=MaxX)

for(pCot=pDong,j=0;j<max;j++,pCot++){

if(pCot[0]==TAM){

pCot[0]=TRANG;

continue;

}//if if(j<M||i<M||j>=max-M||i>=MaxY-M) continue; if(pCot[0]==TRANG){

pDong1=pCot-n;

for(k=0;k<m2;k++,pDong1+=MaxX)

Trang 8

if(pCot1[0]!=DEN) continue;

if(pCot1<pCot) pCot1[0]=TRANG; else pCot1[0]=TAM;

}//for }//if

}//for GlobalUnlock(hPic);

return;

}//

3.3 Thủ tục xoay ảnh

/////////////////////////////////////////////////////////////////////////////

//int IMAGE::Rotate(float angle): ham xoay anh

// (khong dung phep nhan va phep chia)

/////////////////////////////////////////////////////////////////////////////

int IMAGE::Rotate(float angle){

char *pPic,*pDong,*pCot;

char *pPic1,*pDong1,*pCot1;

float tongDongX,tongDongY,tongCotX,tongCotY;

float cos1,sin1;

HGLOBAL hPic1;

int xDong,yDong,xCot,yCot;

int i,j;

int denTa;

cos1=(float)cos(angle);

sin1=(float)sin(angle);

hPic1=GlobalAlloc(GMEM_MOVEABLE,MaxX*MaxY);

if(!hPic1) return 0;

pPic1=(char*)GlobalLock(hPic1);

pPic=(char*)GlobalLock(hPic);

pDong=pPic;

tongDongX=tongDongY=0;

xDong=0;yDong=0;

for(pDong1=pPic1,i=0;i<MaxY;i++,pDong1+=MaxX){

pCot=pDong;

tongCotX=tongDongX;

tongCotY=tongDongY;

xCot=xDong;

yCot=yDong;

for(pCot1=pDong1,j=0;j<max;j++,pCot1++){

if(xCot<max&&yCot<MaxY&&xCot>=0&&yCot>=0){

denTa=0;

if(tongCotX>=0.5&&xCot<max-1) denTa++;

if(tongCotX<=-0.5&&xCot>0) denTa ;

if(tongCotY>=0.5&&yCot<MaxY-1) denTa+=MaxX;

Trang 9

if(tongCotY<=-0.5&&yCot>0) denTa-=MaxX;

pCot1[0]=pCot[denTa];

}else pCot1[0]=TRANG;

tongCotX+=cos1;

tongCotY+=sin1;

if(tongCotX>=1){

pCot++;

xCot++;

tongCotX-=1.0;

}//if

else if(tongCotX<=-1){

tongCotX+=1.0;

pCot ;

xCot ;

}//if

if(tongCotY>=1){

tongCotY-=1.0;

pCot+=MaxX;

yCot++;

}//if else if(tongCotY<=-1){

tongCotY+=1.0;

pCot-=MaxX;

yCot ;

}//if }//for

tongDongX-=sin1;

tongDongY+=cos1;

if(tongDongX>=1){

tongDongX-=1.0;

pDong++;

xDong++;

}//if

else if(tongDongX<=-1){

tongDongX+=1.0;

pDong ;

xDong ;

}//if

if(tongDongY>=1){

tongDongY-=1.0;

pDong+=MaxX;

yDong++;

}//if

else if(tongDongY<=-1){

tongDongY+=1.0;

pDong-=MaxX;

yDong ;

Trang 10

}//if }//for

// copy data

// MoveMemory(pPic,pPic1,MaxX*MaxY);

GlobalUnlock(hPic);

GlobalUnlock(hPic1);

GlobalFree(hPic);

hPic=hPic1;

return 1;

}

3.4 Thủ tục tìm xương ảnh

///////////////////////////////////////////////////////////////////////////////////////////////

//int IMAGE::ThinChar9N(): lam manh chu voi do phuc tap Tmax=9N // (N la tong so diem anh)

// tra lai: 0: loi cap phat

// 1: khong loi

// do phuc tap: -do cac bien ban dau: T1= N (duyet qua anh tim diem bien) // -Danh dau bien T2=2N (moi diem den duyet <=2 lan) // -Xoa Danh dau T3=2N (moi diem den duyet <=2 lan) //-Dung 2 lan ham next: T4=2N

// (moi diem den cua lop bien ngoai se duoc duyet 1 lan)

//-Xet diem kep: T5= N

// (moi diem den cua lop bien trong se duoc duyet 1 lan)

//-Chuyen xuong thanh diem den: T6=N (duyet qua anh)

// Vay do phuc tap Tmax=9N (chu y:Dilation co do phuc tap 9N)

// va khi anh dong nhat den thi do phuc tap la 9N

//////////////////////////////////////////////////////////////////////////////////////////////

int IMAGE::ThinChar9N(){

char *pCot,*pDong,*pPic;

LIST<NetBien> lBien;

NetBien*loBien;

int i,j;

int nBien;

struct NetBien tam;

int ok,k;

pPic=(char*)GlobalLock(hPic);

Lap1LoTrong();

Xoa4DuongBien1();

// do bien cac bien ban dau nBien=0;

lBien.ResetList();

for( pDong=pPic,j=0;j<MaxY;j++,pDong+=MaxX)

Trang 11

for( pCot=pDong,i=0;i<max;i++,pCot++){

if(pCot[0]!=DEN) continue;

ok=0;

for(k=1;k<8;k+=2){

if(pCot[bien[k].dpos]==TRANG){

tam.pHead.pos=k;

tam.pHead.p=pCot;

tam.pLast.p=pCot;

tam.pLast.pos=k-1;

ok=1;

break;

}//if }//for

if(!ok) continue;

if(!lBien.AddLast(tam)){

lBien.Destroy();

return 0;

}//if

nBien++;

lBien.GotoLast();

loBien=lBien.Lock(0);

DanhDauXoa(loBien[0]);

lBien.UnLock(0);

}//for

if(!nBien) return 1;

// xoa cac bien

do{

if(!XoaDanhDau(&lBien,&nBien)){

lBien.Destroy();

return 0;

}//if

lBien.GotoHead();

for(i=0;i<nBien;i++,lBien+=1){

loBien=lBien.Lock(0);

DanhDauXoa(loBien[0]);

lBien.UnLock(0);

}//for

}while(nBien!=0);//while

// chuyen nhung diem xuong thanh diem den

for( pDong=pPic,j=0;j<MaxY;j++,pDong+=MaxX) for( pCot=pDong,i=0;i<max;i++,pCot++){

if(pCot[0]!=TRANG) pCot[0]=DEN; }//for

return 1;

}

Ngày đăng: 02/04/2014, 00:11

HÌNH ẢNH LIÊN QUAN

Hình 1 Dưới đây sẽ trình bày chi tiết các thuật toán trên. - Báo cáo bài thực hành xử lý ảnh
Hình 1 Dưới đây sẽ trình bày chi tiết các thuật toán trên (Trang 2)
Hình 2: Ảnh thu được  sau khi thực hiện chức năng giãn nở lần 2 - Báo cáo bài thực hành xử lý ảnh
Hình 2 Ảnh thu được sau khi thực hiện chức năng giãn nở lần 2 (Trang 3)
Hình 4: Ảnh thu được sau khi thực hiện chức năng xoay ảnh với góc 0.3  radian - Báo cáo bài thực hành xử lý ảnh
Hình 4 Ảnh thu được sau khi thực hiện chức năng xoay ảnh với góc 0.3 radian (Trang 5)
Hình 5: Ảnh thu được sau khi thực hiện chức năng Bone finding. - Báo cáo bài thực hành xử lý ảnh
Hình 5 Ảnh thu được sau khi thực hiện chức năng Bone finding (Trang 6)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w