📄 dct.backup.cpp
字号:
#include "stdafx.h"
#include "dct.h"
#define PI 3.141593
btype JPEGTable[8][8]={16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,
14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,
18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,
49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; //标准量化表;
void mode2table(int mode, bool adapt, ptype **P, btype QTable[8][8]) {
switch (mode) {
case 1:
for (int i=0;i<8;i++)
for (int j=0;j<8;j++)
QTable[i][j]=65; //均匀
break;
case 2:
for (int i=0;i<8;i++)
for (int j=0;j<8;j++)
QTable[i][j]=10+8*(i+j); //变步长
break;
default:
for (int i=0;i<8;i++)
for (int j=0;j<8;j++)
QTable[i][j]=JPEGTable[i][j];//标准量化表
}
}
blstype Quantization(ptype **a, unsigned int width, unsigned int height, btype (**Q)[8][8], btype QTable[8][8])
{
btype (*QuanTable)[8][8];
blstype NM;
unsigned int nrow,ncolumn;
btype va[8][8];
double Dctcoefficient[8][8];
nrow=height/8;
ncolumn=width/8;
NM=nrow*ncolumn;
QuanTable=new btype [NM][8][8];
*Q=QuanTable;
for(unsigned int i=0;i<NM;i++)
{
int ij=i+10;
for(int j=0;j<8;j++)
{
for(int k=0;k<8;k++)
{
va[j][k]=a[i/ncolumn*8+j][i%ncolumn*8+k]; //a[(i/ncolumn+j)*column+i%ncolumn*8+k];
}
}
Fdct(va,Dctcoefficient);
for(int j=0;j<8;j++)
{
for(int k=0;k<8;k++)
{
if(Dctcoefficient[j][k]>0)
QuanTable[i][j][k]=btype(Dctcoefficient[j][k]/QTable[j][k]+0.5);
else
QuanTable[i][j][k]=btype(Dctcoefficient[j][k]/QTable[j][k]-0.5);
}
}
}
return NM;
}
int IQuantization(ptype ***P, btype a[][8][8], unsigned int height, unsigned int width, btype QTable[8][8])
{
ptype **IQuanTable=NULL;
IQuanTable = new ptype *[height];
if (!IQuanTable) {
printf("Allocate height error.\n");
return 1;
}
for (unsigned int j=0; j<height; j++) {
IQuanTable[j]=new ptype [width];
if (!IQuanTable[j]) {
printf("Allocate width error.\n");
return 1;
}
}
*P=IQuanTable;
double va[8][8];
ptype vb[8][8];
unsigned int nrow=height/8;
unsigned int ncolumn=width/8;
blstype NM=nrow*ncolumn;
for(unsigned int i=0;i<NM;i++)
{
for(int u=0;u<8;u++)
for(int v=0;v<8;v++)
va[u][v]=a[i][u][v]*QTable[u][v];
Idct(va,vb);
for(int u=0;u<8;u++)
for(int v=0;v<8;v++)
IQuanTable[i/ncolumn*8+u][i%ncolumn*8+v]=vb[u][v]; //[(i/ncolumn*8+u)*column+i%ncolumn*8+v]
}
return 0;
}
void Fdct(btype va[][8],double vb[][8])
{
double c;
double CosTable[8][8]={1.0,0.98078528040323,0.92387953251129,0.83146961230255,0.70710678118655,0.55557023301960,0.38268343236509,0.19509032201613,
1.0,0.83146961230255,0.38268343236509,-0.19509032201613,-0.70710678118655,-0.98078528040323,-0.92387953251129,-0.55557023301960,
1.0,0.55557023301960,-0.38268343236509,-0.98078528040323,-0.70710678118655,0.19509032201613,0.92387953251129,0.83146961230255,
1.0,0.19509032201613,-0.92387953251129,-0.55557023301960,0.70710678118655,0.83146961230255,-0.38268343236509,-0.98078528040323,
1.0,-0.19509032201613,-0.92387953251129,0.55557023301960,0.70710678118655,-0.83146961230255,-0.38268343236509,0.98078528040323,
1.0,-0.55557023301960,-0.38268343236509,0.98078528040323,-0.70710678118655,-0.19509032201613,0.92387953251129,-0.83146961230255,
1.0,-0.83146961230255,0.38268343236509,0.19509032201613,-0.70710678118655,0.98078528040323,-0.92387953251129,0.55557023301960,
1.0,-0.98078528040323,0.92387953251129,-0.83146961230255,0.70710678118655,-0.55557023301960,0.38268343236509,-0.19509032201613};
for(int u=0;u<8;u++)
{
for(int v=0;v<8;v++)
{
vb[u][v]=0.0;
for(int j=0;j<8;j++)
for(int k=0;k<8;k++)
vb[u][v]=vb[u][v]+va[j][k]*CosTable[j][u]*CosTable[k][v];
if((0==u)&&(0==v))
c=0.5;
else if((0==u)||(0==v))
c=1/sqrt(2.0);
else
c=1.0;
vb[u][v]=c*vb[u][v]/4.0;
}
}
}
void Idct(double va[8][8],ptype vb[][8])
{
double c,d;
double CosTable[8][8]={1.0,0.98078528040323,0.92387953251129,0.83146961230255,0.70710678118655,0.55557023301960,0.38268343236509,0.19509032201613,
1.0,0.83146961230255,0.38268343236509,-0.19509032201613,-0.70710678118655,-0.98078528040323,-0.92387953251129,-0.55557023301960,
1.0,0.55557023301960,-0.38268343236509,-0.98078528040323,-0.70710678118655,0.19509032201613,0.92387953251129,0.83146961230255,
1.0,0.19509032201613,-0.92387953251129,-0.55557023301960,0.70710678118655,0.83146961230255,-0.38268343236509,-0.98078528040323,
1.0,-0.19509032201613,-0.92387953251129,0.55557023301960,0.70710678118655,-0.83146961230255,-0.38268343236509,0.98078528040323,
1.0,-0.55557023301960,-0.38268343236509,0.98078528040323,-0.70710678118655,-0.19509032201613,0.92387953251129,-0.83146961230255,
1.0,-0.83146961230255,0.38268343236509,0.19509032201613,-0.70710678118655,0.98078528040323,-0.92387953251129,0.55557023301960,
1.0,-0.98078528040323,0.92387953251129,-0.83146961230255,0.70710678118655,-0.55557023301960,0.38268343236509,-0.19509032201613};
for(int j=0;j<8;j++)
{
for(int k=0;k<8;k++)
{
d=0.0;
for(int u=0;u<8;u++)
{
for(int v=0;v<8;v++)
{
if((0==u)&&(0==v))
c=0.5;
else if((0==u)||(0==v))
c=1/sqrt(2.0);
else
c=1.0;
d=d+c*va[u][v]*CosTable[j][u]*CosTable[k][v];
}
}
if(d<=0)
vb[j][k]=0;
else {
d=d/4+0.5;
if (d>255)
vb[j][k]=255;
else
vb[j][k]=ptype(d);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -