📄 bindct.cpp
字号:
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
int array[128][128];
int array_a[4][4];
void binDCT(int x[4][4])
{
int i,j;
int z[4][4];
int c[4][4]={{1,1,1,1},{2,1,-1,-2},{1,-1,-1,1},{1,-2,2,-1}};
for(i=0;i<4;i++)
for(j=0;j<4;j++)
z[i][j]=c[i][0]*x[0][j]+c[i][1]*x[1][j]+c[i][2]*x[2][j]+c[i][3]*x[3][j]; //行变换
for(i=0;i<4;i++)
for(j=0;j<4;j++)
array_a[i][j]=z[i][0]*c[j][0]+z[i][1]*c[j][1]+z[i][2]*c[j][2]+z[i][3]*c[j][3];
}
void main()
{
int x,y,m,n,i,j;
int Row=128,Col=128;
FILE *fp;
FILE *out;
fp=fopen("D:\\felicia\\lena128.raw","rb");//象素分布
for(m=0;m<Row;m++)
for(n=0;n<Col;n++)
{
fread(&array[m][n],1,1,fp); //读入数据赋给二维数组
array[m][n]=array[m][n]-128;
}
fclose(fp);
fp=fopen("d:\\felicia\\lena128_cofficient_shift.RAW","wb");
for(x=0;x<Row;x++)
{
for(y=0;y<Col;y++)
{
fprintf(fp,"%6d",array[x][y]);
if(((y+1)%4)==0&&y!=127)
fprintf(fp,"\t");
}
fprintf(fp,"\n");
if(((x+1)%4)==0&&x!=127)
fprintf(fp,"\n");
}
fclose(fp);
for(x=0;x<Row;x+=16) //16个数据为一个大块
{
for(y=0;y<Col;y+=16)
{
for(m=0;m<16;m+=4) //分成4个小块
{
for(n=0;n<16;n+=4)
{
for(i=0;i<4;i++) //对每个小块进行处理
for(j=0;j<4;j++)
array_a[i][j]=array[x+m+i][y+n+j];
binDCT(array_a); //第一次变换
for(i=0;i<4;i++)
for(j=0;j<4;j++)
array[x+m+i][y+n+j]=array_a[i][j]; //将变换后的系数添回原来的4×4矩阵
}
}
/* for(m=0;m<16;m+=4) //分成4个小块
for(n=0;n<16;n+=4)
array_a[m/4][n/4]=array[x+m][y+n];
binDCT(array_a); //第二次变换,针对16×16大块中的16个DC系数
for(m=0;m<16;m+=4)
for(n=0;n<16;n+=4)
array[x+m][y+n]=array_a[m/4][n/4];
*/ }
}
out=fopen("D:\\felicia\\H264_binDCT_shift.raw","wb");//第二次变换后系数分布
for(x=0;x<Row;x++)
{
for(y=0;y<Col;y++)
{
fprintf(out,"%6d",array[x][y]);
if(((y+1)%4)==0&&y!=127)
fprintf(out,"\t");//分割列
}
fprintf(out,"\n");
if(((x+1)%4)==0&&x!=127)
fprintf(out,"\n");
}
// for(x=0;x<Row;x++)
// for(y=0;y<Col;y++) //输出系数(线形)
// fwrite(&array[x][y],1,1,fp);
fclose(out);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -