BÁO CÁO BÀI THỰC HÀNH
BÁO CÁO BÀI THỰC HÀNH
MÔN: XỬ LÝ ẢNH
MÔN: XỬ LÝ ẢNH
LỚP: K10T3
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
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.
2
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
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);
6
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]=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)
pDong1=pCot-n;
for(k=0;k<m2;k++,pDong1+=MaxX)
7
for(pCot1=pDong1,z=0;z<m2;z++,pCot1++){
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);
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;
//-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)
10
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;
for( pCot=pDong,i=0;i<max;i++,pCot++){
if(pCot[0]!=TRANG) pCot[0]=DEN;
}//for
return 1;
}
11