⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bindct.cpp

📁 视频压缩标准H264的变换部分的算法实现
💻 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 + -