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

Đề cương xử lý ảnh pdf

9 391 5
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Đề cương xử lý ảnh pdf
Tác giả Lê Nhung
Trường học Trường Đại học Sư phạm Kỹ thuật TP.HCM
Chuyên ngành Toán Tin
Thể loại Đề cương
Thành phố Hồ Chí Minh
Định dạng
Số trang 9
Dung lượng 80,5 KB

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

Nội dung

Trang 1

♥♥♥ Lê Nhung _ 48 Toán Tin ♥♥♥

ĐỀ CƯƠNG ƠN TẬP : XỬ LÝ ẢNH Serialize:

ar.Read(&bfHeader,sizeof(bfHeader));

if (bfHeader.bfType !=('M'<<8|'B'))

{MessageBox(NULL,"Khong phai tep BITMAP!","Thong bao",MB_OK);

return;}

int m,n;BYTE b;

ar.Read(&biHeader,sizeof(biHeader));

if (biHeader.biBitCount==8)

{int u;

for (u=0;u<256;u++)

ar.Read(&Colors[u],sizeof(RGBQUAD));

for (m=0;m<biHeader.biHeight;m++)

for (n=0;n<biHeader.biWidth;n++) { ar.Read(&b,sizeof(BYTE));

Data[m][n]=b ; } }

else

{MessageBox(NULL,"Khong xu ly anh khac 256 mau!","Thong bao",MB_OK);

return; }

View / On draw:

BYTE b;int m,n;

BYTE R,G,B;

for (m=0;m<pDoc->biHeader.biHeight;m++)

for (n=0;n<pDoc->biHeader.biWidth ;n++) {

b=pDoc->Data[m][n];

R=pDoc->Colors[b].rgbRed;

G=pDoc->Colors[b].rgbGreen;

B=pDoc->Colors[b].rgbBlue;

pDC->SetPixel(n,pDoc->biHeader.biHeight-m,

RGB(R,G,B));

}

Lấy âm bản:

C Doc* pDoc = GetDocument();

int m,n; int L=256;

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

for(m=0;m<M;m++)

for(n=0;n<N;n++)

pDoc->Data[m][n]= L- pDoc->Data[m][n]

Invalidate();

Hiện his

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n,u;

float H[256];

for(u=0;u<256;u++) H[u]=0;

for(m=0;m<M;m++)

for(n=0;n<N;n++)

H[pDoc->Data[m][n]]++;

for(u=0;u<256;u++) H[u]/=M*N;

CClientDC pDC(this);

int x=100,y=400;

for(u=0;u<256;u++)

{ pDC.MoveTo(x+u,y);

pDC.LineTo(x+u,y-H[u]*2000);}

Trang 2

quay dọc:

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n;

BYTE X[1000][1000];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

pDoc->Data[m][n]=X[M-1-m]

[n];

Invalidate();

quay ngang

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n;

BYTE X[1000][1000];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n]; for(m=0;m<M;m++)

for(n=0;n<N;n++)

pDoc->Data[m][n]=X[m][N-1-n];

Invalidate();

quay trái:

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n,tg;

BYTE X[1000][1000];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n];

for(m=0;m<N;m++)

for(n=0;n<M;n++)

pDoc->Data[m][n]=X[n][N-1-m];

tg=pDoc->biHeader.biHeight;

pDoc->biHeader.biHeight=pDoc->biHeader.biWidth;

pDoc->biHeader.biWidth=tg;

Invalidate();

quay phải:

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n,tg;

BYTE X[1000][1000];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n]; for(m=0;m<N;m++)

for(n=0;n<M;n++)

pDoc->Data[m][n]=X[M-1-n] [m];

tg=pDoc->biHeader.biHeight;

pDoc->biHeader.biHeight=pDoc->biHeader.biWidth;

pDoc->biHeader.biWidth=tg;

Invalidate();

quay 180 độ:

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n;

BYTE X[1000][1000];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

pDoc->Data[m][n]=X[M-1-m][N-1-n];

Invalidate();

Khuếch đại ảnh bằng phương pháp lặp:

Trang 3

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n;

//chen them hang moi

for(m=M-1;m>=0;m )

for(n=0;n<N;n++) { pDoc->Data[2*m][n]=pDoc->Data[m][n];

pDoc->Data[2*m+1][n]=pDoc->Data[m][n];

} //chen them cot

for(n=N-1;n>=0;n )

for(m=0;m<2*M;m++) { pDoc->Data[m][2*n]=pDoc->Data[m][n];

pDoc->Data[m][2*n+1]=pDoc->Data[m][n];

} pDoc->biHeader.biHeight*=2;

pDoc->biHeader.biWidth*=2;

Invalidate()

Khuếch đại ảnh bằng phương pháp nội suy:

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n;

//Chen theo hang

for (m=M-1;m>=0;m )

for (n=0;n<N;n++)

{ pDoc->Data[2*m][n]=pDoc->Data[m][n];

if (m==M-1)

pDoc->Data[2*m+1][n]=pDoc->Data[m][n]/2;

else pDoc->Data[2*m+1][n]=(pDoc->Data[m][n]+pDoc->Data[m+1][n])/2;

}

//chen theo cot

for (n=N-1;n>=0;n )

for (m=0;m<2*M;m++)

{ pDoc->Data[m][2*n]=pDoc->Data[m][n];

if (n==N-1) pDoc->Data[m][2*n+1]=pDoc->Data[m][n]/2;

pDoc->Data[m][2*n+1]=(pDoc->Data[m][n]+pDoc->Data[m][n+1])/2;

} pDoc->biHeader.biHeight*=2;

pDoc->biHeader.biWidth*=2;

Invalidate();

Loc trung bình

Trang 4

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

BYTE X[1000][1000];

int m,n,k,l,lc=1;

int tong;

BYTE H[3][3]={{1,1,1},{1,1,1},{1,1,1}};

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n];

for(m=lc;m<M-lc;m++)

for(n=lc;n<N-lc;n++) { tong=0;

for(k=0;k<2*lc;k++)

for(l=0;l<2*lc;l++) tong+=H[k][l]*X[m-k+lc][n-l+lc];

pDoc->Data[m][n]=BYTE(tong/9);

} Invalidate();

Lọc trọng số

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

BYTE X[1000][1000];

int m,n,k,l,lc=1;

int tong;

BYTE H[3][3]={{1,1,1},{1,2,1},{1,1,1}};

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n];

for(m=lc;m<M-lc;m++)

for(n=lc;n<N-lc;n++) { tong=0;

for(k=0;k<2*lc;k++)

for(l=0;l<2*lc;l++) tong+=H[k][l]*X[m-k+lc][n-l+lc];

pDoc->Data[m][n]=BYTE(tong/10);

} Invalidate();

Lọc nhị phân Gauss

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

BYTE X[1000][1000];

int m,n,k,l,lc=1;

int tong;

BYTE H[3][3]={{1,2,1},{2,4,2},{1,2,1}};

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n];

Trang 5

for(n=lc;n<N-lc;n++)

{ tong=0;

for(k=0;k<=2*lc;k++)

for(l=0;l<=2*lc;l++) tong+=H[k][l]*X[m-k+lc][n-l+lc];

pDoc->Data[m][n]=BYTE(tong/16);

}

Invalidate();

Loc giả trung vị

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int i,j;

int H[256],L=255;

BYTE Y[1000][1000];

int chiso,lc,k,l,K=3,d=3;

int min,max,m1,m2;

//giữ biên

for(i=0;i<M;i++)

for (j=0;j<N;j++)

Y[i][j]=pDoc->Data[i][j];

// tính các điểm trong biên

lc=(3-1)/2;

for (i=lc;i<=M-lc;i++)

for(j=lc;j<=N-lc;j++)

{chiso=0;

for (k=-lc;k<=lc;k++)

for (l=-lc;l<=lc;l++)

H[chiso++]=Y[i+k][j+l];

//tìm max trong các gtri min ( gtri m1)

m1=0;

for (k=0;k<=K*K-d;k++)

{ min=H[k];

for (l=k+1;l<k+d;l++)

if (min>H[l]) min=H[l];

if (m1<min) m1=min;

} //tính min trong các gtri max (gtri m2)

m2=L;

for (k=0;k<=K*K-d;k++)

{ max=H[k];

for (l=k+1;l<k+d;l++)

if (max<H[l]) max=H[l];

if (m2>max) m2=max;

} }

pDoc->Data[i][j]=(m1+m2)/2;

Invalidate();

THAY ĐỔI ĐỘ TƯƠNG PHẢN

C Doc* pDoc = GetDocument();

Trang 6

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int m,n,u;

float LUT[256];

int a=80,Va=120,b=255,Vb=255;

int L=255;

for(u=0;u<=L;u++)

{ if(u<=a)

LUT[u]=(u*Va/a);

else if(u<b)

LUT[u]=Va+(u-a)*(Vb-Va+1)/(b-a+1);

else

LUT[u]=Vb+(u-b)*(L-Vb+1)/(L-b+1);

}

for(m=0;m<M;m++)

for(n=0;n<N;n++) {

pDoc->Data[m][n]=LUT[pDoc->Data[m][n]];

} Invalidate();

PHÂN ẢNH THÀNH 2 VÙNG

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int t0; int L=255;

int tong1, tong2, m, n, n1, n2;

t0=L/2;

while(1)

{ tong1=tong2=0;

n1=n2=0;

for(m=0;m<M;m++)

for(n=0;n<N;n++)

if(pDoc->Data[m][n]<t0)

{ tong1+=pDoc->Data[m][n];n1++;}

else {tong2+=pDoc->Data[m][n];n2++;}

if(tong1/n1+tong2/n2==2*t0)

t0=(tong1/n1+tong2/n2)/2;

}

for(m=0;m<M;m++)

for(n=0;n<N;n++)

if(pDoc->Data[m][n]<t0)

pDoc->Data[m][n]=tong1/n1;

else pDoc->Data[m][n]=tong2/n2;

Invalidate();

PHÂN ẢNH THÀNH 3 VÙNG

C Doc* pDoc = GetDocument();

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int t1=80,t2=160;

int tong1=0,tong2=0,tong3=0;

Trang 7

int m,n,n1=0,n2=0,n3=0;

for(m=0;m<M;m++)

for(n=0;n<N;n++)

if(pDoc->Data[m][n]<t1) { tong1+=pDoc->Data[m][n];

n1++;

} else if(pDoc->Data[m][n]<t2) {tong2+=pDoc->Data[m][n];

n2++;

} else { tong3+=pDoc->Data[m][n];

n3++;

} for(m=0;m<M;m++)

for(n=0;n<N;n++)

if(pDoc->Data[m][n]<t1)

pDoc->Data[m][n]=tong1/n1;

else if(pDoc->Data[m][n]<t2)

pDoc->Data[m][n]=tong2/n2;

else pDoc->Data[m][n]=tong3/n3;

Invalidate();

TOÁN TỬ GRADIENT

C Doc* pDoc = GetDocument();

int i,j,k,l;

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int lc=1,K=3,d=100;

int L=255;

BYTE dt[1000][1000];

int hm[3][3]={{1,1,1},{0,0,0},{-1,-1,-1}};

int hn[3][3]={{1,0,-1},{1,0,-1},{1,0,-1}};

// xet cac diem phia ngoai

for(i=0;i<M;i++)

for(j=0;j<N;j++)

if ( 2* pDoc->Data[i][j]>=d)

dt[i][j]=L;

else dt[i][j]=0;

// tinh lai cac diem phia trong

for(i=lc;i<M-lc;i++)

for(j=lc;j<N-lc;j++)

{int tong1=0;

int tong2=0;

for( k=0;k<=2*lc;k++)

for(l=0;l<=2*lc;l++) {tong1+=hm[k][l]*pDoc->Data[i-k+lc][j-l+lc];

tong2+=hn[k][l]*pDoc->Data[i-k+lc][j-l+lc];

} if( abs(tong1)+abs(tong2)>=d)

dt[i][j]=L;

else dt[i][j]=0;

}

Trang 8

for(j=0;j<N;j++)

pDoc->Data[i][j]=dt[i][j];

Invalidate();

TOÁN TỬ LA BÀN

C Doc* pDoc = GetDocument();

int i,j,k,l;

BYTE dt[1000][1000];

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int h0[3][3]={{1,0,-1},{1,0,-1},{1,0,-1}};

int h1[3][3]={{0,-1,-1},{1,0,-1},{1,1,0}};

int h2[3][3]={{-1,-1,-1},{0,0,0},{1,1,1}};

int h3[3][3]={{-1,-1,0},{-1,0,1},{0,1,1}};

int h4[3][3]={{-1,0,1},{-1,0,1},{-1,0,1}};

int h5[3][3]={{0,1,1},{-1,0,1},{-1,-1,0}};

int h6[3][3]={{1,1,1},{0,0,0},{-1,-1,-1}};

int h7[3][3]={{1,1,0},{1,0,-1},{0,-1,-1}};

int x[8],max,d=80;

// tim diem co gia tri cao nhat

int lc=1;

int K=3;

// tao ban sao gt

for (i=0;i<M;i++)

for(j=0;j<N;j++)

dt[i][j]=pDoc->Data[i][j];

for (i=0;i<M;i++)

for(j=0;j<N;j++)

if (pDoc->Data[i][j]>d)

pDoc->Data[i][j]=255;

else pDoc->Data[i][j]=0;

//tinh lai cac diem phia trong

for(i=lc;i<M-lc;i++)

for(j=lc;j<N-lc;j++)

{ x[0]=x[1]=x[2]=x[3]=x[4]=x[5]=x[6]=x[7]=0;

for(k=0;k<=2*lc;k++)

for(l=0;l<=2*lc;l++) {

x[0]+=h0[k][l]*dt[i-k+lc][j-l+lc];

x[1]+=h1[k][l]*dt[i-k+lc][j-l+lc];

x[2]+=h2[k][l]*dt[i-k+lc][j-l+lc];

x[3]+=h3[k][l]*dt[i-k+lc][j-l+lc];

x[4]+=h4[k][l]*dt[i-k+lc][j-l+lc];

x[5]+=h5[k][l]*dt[i-k+lc][j-l+lc];

x[6]+=h6[k][l]*dt[i-k+lc][j-l+lc];

x[7]+=h7[k][l]*dt[i-k+lc][j-l+lc];

}

max=abs(x[0]);

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

if( max< abs(x[k]))

max= abs(x[k]);

if (max> d)

pDoc->Data[i][j]=255;

Trang 9

else

pDoc->Data[i][j]=0;

}

Invalidate();

TOÁN TỬ LAPLACE

C Doc* pDoc = GetDocument();

int n,m,k,l;

int M=pDoc->biHeader.biHeight;

int N=pDoc->biHeader.biWidth;

int H[3][3]={{-1,2,-1},{2,-4,2},{-1,2,-1}};

BYTE X[1000][1000];

for(m=0;m<M;m++)

for(n=0;n<N;n++)

X[m][n]=pDoc->Data[m][n];

for(m=1;m<M-1;m++)

for(n=1;n<N-1;n++)

{

int tong =0;

for(k=0;k<2;k++)

for(l=0;l<2;l++) tong +=H[k][l]*pDoc->Data[m-k+1][n-l+1];

X[m][n]=tong;

}

for(m=0;m<M;m++)

for(n=0;n<N;n++)

pDoc->Data[m][n]=X[m][n];

Invalidate();

Ngày đăng: 08/07/2014, 12:21

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w