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

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

9 389 5

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 80,5 KB

Nội dung

♥♥♥ Leâ Nhung _ 48 Toaù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);} 1 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: 2 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 3 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]; 4 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/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(); 5 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) break; 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; 6 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; } 7 for(i=0;i<M;i++) 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; 8 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(); 9 . ♥♥♥ Leâ Nhung _ 48 Toaù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. 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: 2 C Doc* pDoc = GetDocument(); int M=pDoc->biHeader.biHeight; int N=pDoc->biHeader.biWidth; int. 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

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

TỪ KHÓA LIÊN QUAN

w