DCT变换程序
- 格式:doc
- 大小:81.50 KB
- 文档页数:7
DCT程序代码:#include <stdio.h>#include <math.h>#define PI 3.14159#define N 8//================定义8*8数据块=================int Data[N][N]={{132,132,119,118,119,110,110,110},{130,133,128,118,119,112,108,110},{133,130,130,125,130,117,115,110},{130,130,130,130,127,117,117,117},{130,135,130,130,125,118,117,111},{130,130,130,130,130,120,117,111},{135,130,129,130,121,117,117,111},{136,129,130,130,118,115,117,116}};//===============定义量化矩阵==================int Q[N][N]={{17,18,24,47,99,99,99,99},{18,21,26,66,99,99,99,99},{24,26,56,99,99,99,99,99},{47,66,99,99,99,99,99,99},{99,99,99,99,99,99,99,99},{99,99,99,99,99,99,99,99},{99,99,99,99,99,99,99,99},{99,99,99,99,99,99,99,99},};int A[N][N]={0};int B[N][N]={0};int C[N][N]={0};int getdata();void transpose(int **a1,int **at1); //转移矩阵声明void multiplymatrix(int **a2,int **b2,int **c2 ); //两个矩阵相乘void printmatrix(int **a3); //输出矩阵声明int main(void){int i,j,q,p;int At[N][N]={0};int Mid[N][N]={0};int Res[N][N]={0};getdata();printf("The Data is :\n");printmatrix((int **)Data );getchar();printf("The A is :\n");printmatrix((int **)A);getchar();transpose((int **)A,(int **)At);multiplymatrix((int **)A,(int **)Data,(int **)Mid ); printf("The Mid is :\n");printmatrix((int **)Mid );getchar();multiplymatrix((int **)Mid,(int **)At,(int **)Res ); printf("The result is :\n");printmatrix((int **)Res );getchar();for(i=0;i<N;i++){for(j=0;j<N;j++){Res[i][j]=(Res[i][j]>>14);}}printf("DCT系数为:\n");printmatrix((int **)Res );getchar();printf("量化后的变换域矩阵为:\n");for(p=0;p<N;p++)for(q=0;q<N;q++){B[p][q]=2*Res[p][q]/Q[p][q];printf("%3.1d",B[p][q]);if(q+1==N)printf("\n");}printf("反量化后矩阵:\n");for(p=0;p<N;p++)for(q=0;q<N;q++){C[p][q]=B[p][q]*Q[p][q]/2;printf("%3.1d",C[p][q]);if(q+1==N)printf("\n");}return 0;}int getdata(){int i,j,k=0 ;double u1, u2;u1=sqrt(1.0/N);u2=sqrt(2.0/N);for(i=0;i<N; i++){for(j=0;j<N;j++){if(i ==0){A[i][j]=(int)(128*u1*cos(((2*j)+1)*i*PI/(2*N)));}else{A[i][j]=(int)(128*u2*cos(((2*j)+1)*i*PI/(2*N)));}}}return 0;}//=====================定义转移矩阵void transpose(int **a1,int **at1){int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){*(((int*)at1+j*N)+i)=*(((int*)a1+i*N)+j);}}}//======================定义矩阵相乘void multiplymatrix(int **a2,int **b2,int **c2 ){int i,j,k,temp;for(i=0;i<N;i++){for(j=0;j<N;j++){temp = 0;for( k=0; k<N;k++){temp+=(*(((int*)a2+i*N)+k))*(*(((int*)b2+k*N)+j)) ;}*(((int*)c2+i*N)+j) = temp;}}}//=====================定义输出矩阵void printmatrix(int **a3){int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%d,",*(((int*)a3+i*N)+j));}printf("\n");}}IDCT程序代码:#include <math.h>#include <iostream.h>#include <iomanip.h>#define pi 3.1415926void main(void){int u,v,x,y;double CU,CV;double I[8][8]={0};double D[8][8]={{162,162,162,161,162,157,163,161}, {162,162,162,161,162,157,163,161}, {162,162,162,161,162,157,163,161}, {162,162,162,161,162,157,163,161}, {162,162,162,161,162,157,163,161}, {164,164,158,155,161,159,159,160}, {160,160,163,158,160,162,159,156}, {159,159,155,157,158,159,156,157} };double F[8][8]={{972,56,-7,-1,-6,3},{-13,2,3,2,-1,-10,-2,2},{-12,4,10,0,1,1,-2,2},{-4,0,-2,2,-2,-3,-4,-3},{-1,-2,4,-3,1,1,-3,-4},{1,-3,-1,2,3,2,-2,0},{2,-3,-4,3,2,-1,-1,2},{0,2,0,2,-2,1,-2,-1}};/*double F[8][8]={{972,56,},{-13,},{0},{0},{0},{0},{0},{0,}};*/for (x=0;x<8;x++)for (y=0;y<8;y++)for (u=0;u<8;u++)for (v=0;v<8;v++){if (u==0)CU=1/sqrt(2);elseCU=1;if (v==0)CV=1/sqrt(2);elseCV=1;I[x][y]+=0.25*CU*CV*F[u][v]*cos((2*x+1)*u*pi/16)*cos((2*y+1)*v*pi/16);}for (x=0;x<8;x++){for (y=0;y<8;y++){cout<<setw(8)<<I[x][y]<<" ";}cout<<endl;}}程序运行结果:8*8数据块量化后所得矩阵:DCT变换系数:反量化后矩阵:IDCT变换后重建数据亮度采用左上角3个系数重建图像:。