来自:http://blog.youkuaiyun.com/calcular/article/details/46804829
#include<iostream>
#include<math.h>
using namespace std;
#define PI 3.14159265354
#define DCT_SIZE 8
float DCT_Mat[DCT_SIZE][DCT_SIZE];
float DctMap[DCT_SIZE][DCT_SIZE]=
{
130,130,130,129,134,133,129,130,
130,130,130,129,134,133,130,130,
130,130,130,129,132,132,130,130,
129,130,130,129,130,130,129,129,
127,128,127,129,131,129,131,130,
127,128,127,128,127,128,132,132,
125,126,129,129,127,129,133,132,
127,125,128,128,126,130,131,131
};
//需要DCT处理的图像输入口
/*float DctMap[DCT_SIZE][DCT_SIZE]=
{
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0
};*/
float DctMapTmp[DCT_SIZE][DCT_SIZE];
void InitDctMat()
{
int i,j,t;
for(i=0;i<DCT_SIZE;i++) DCT_Mat[0][i]=sqrt(2.0/DCT_SIZE)*sqrt(1.0/2);
for(i=1;i<DCT_SIZE;i++)
{
t=0;
for(j=0;j<DCT_SIZE;j++)
{
DCT_Mat[i][j]=sqrt(2.0/DCT_SIZE)*cos(PI/(2.0*DCT_SIZE)*(i+t));t+=2*i;
}
}
}
void DCT()
{
float t=0;
int i,j,k;
for(i=0;i<DCT_SIZE;i++){
for(j=0;j<DCT_SIZE;j++){
t=0;
for(k=0;k<DCT_SIZE;k++)
t+=DCT_Mat[i][k]*DctMap[k][j];
DctMapTmp[i][j]=t;
}
}
for(i=0;i<DCT_SIZE;i++){
for(j=0;j<DCT_SIZE;j++){
t=0;
for(k=0;k<DCT_SIZE;k++)
t+=DctMapTmp[i][k]*DCT_Mat[j][k];
DctMap[i][j]=t;
}
}
}
void IDCT()
{
float t=0;
int i,j,k;
for(i=0;i<DCT_SIZE;i++){
for(j=0;j<DCT_SIZE;j++){
t=0;
for(k=0;k<DCT_SIZE;k++)
t+=DCT_Mat[k][i]*DctMap[k][j];
DctMapTmp[i][j]=t;
}
}
for(i=0;i<DCT_SIZE;i++){
for(j=0;j<DCT_SIZE;j++){
t=0;
for(k=0;k<DCT_SIZE;k++)
t+=DctMapTmp[i][k]*DCT_Mat[k][j];
DctMap[i][j]=(int)(t);
}
}
}
int main()
{
InitDctMat();
DCT();
for(int i=0;i<DCT_SIZE;i++)
{
for(int j=0;j<DCT_SIZE;j++)
{
cout<<DctMap[i][j]<<" ";
}
cout<<endl;
}
IDCT();
for(int i=0;i<DCT_SIZE;i++)
{
for(int j=0;j<DCT_SIZE;j++)
{
cout<<DctMap[i][j]<<" ";
}
cout<<endl;
}
}
本文介绍了一种实现一维离散余弦变换(DCT)及其逆变换(IDCT)的方法,并通过一个8x8像素的示例矩阵展示了如何进行DCT和IDCT运算。该文首先定义了DCT变换矩阵,然后利用这个矩阵对原始图像块进行变换,再通过逆变换将变换后的图像块还原回接近原始图像的状态。
933

被折叠的 条评论
为什么被折叠?



