数据压缩作业1-2

作业要求
对群里发的down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵。

附加条件
两个文件的分辨率均为256*256,yuv为4:2:0采样空间
rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。

1、计算RGB

#include<stdio.h>
#include
#include<math.h>
using namespace std;

#define Res 256*256

int main()
{
unsigned char R[Res]={0},G[Res]={0},B[Res]={0};
double R1[256]={0},G1[256]={0},B1[256]={0};
double R2=0,G2=0,B2=0;

FILE *pic,*rr,*gg,*bb;
fopen_s(&pic,"C:/Users/哈哈哈/Desktop/down.rgb","rb");
fopen_s(&rr,"C:/Users/哈哈哈/Desktop/Red.txt","w");
fopen_s(&gg,"C:/Users/哈哈哈/Desktop/Green.txt","w");
fopen_s(&bb,"C:/Users/哈哈哈/Desktop/Blue.txt","w");

unsigned char Array[Res*3]={0};
fread(Array,1,Res*3,pic);
for(int i=0,j=0;i<Res*3;i=i+3,j++)
{
	B[j]=*(Array+i);
	G[j]=*(Array+i+1);
	R[j]=*(Array+i+1+2);
}

for(int i=0;i<Res;i++)
{
	R1[R[i]]++;
	G1[G[i]]++;
	B1[B[i]]++;
}

for(int i=0;i<256;i++)
{
	R1[i]=R1[i]/(Res);
	B1[i]=B1[i]/(Res);
	G1[i]=G1[i]/(Res);
}

for(int i=0;i<256;i++)
{
	fprintf(rr,"%d\t%f\n",i,R1[i]);
	fprintf(gg,"%d\t%f\n",i,G1[i]);
	fprintf(bb,"%d\t%f\n",i,B1[i]);
}

for(int i=0;i<256;i++)
{
	if(R1[i]!=0)
	{
		R2+=-R1[i]*log(R1[i])/log(double(2));
	}
	if(G1[i]!=0)
	{
		G2+=-G1[i]*log(G1[i])/log(double(2));
	}
	if(B1[i]!=0)
	{
		B2+=-B1[i]*log(B1[i])/log(double(2));
	}
}
printf("R的熵为%f\n",R2);
printf("G的熵为%f\n",G2);
printf("B的熵为%f\n",B2);

system("pause");

return 0;

}

在这里插入图片描述

2、计算YUV

#include<stdio.h>
#include
#include<math.h>
using namespace std;

#define Res 256*256

int main()
{
unsigned char Y[Res]={0},U[Res/4]={0},V[Res/4]={0};
double Y1[256]={0},U1[256]={0},V1[256]={0};
double Y2=0,U2=0,V2=0;

FILE *pic, *py, *pu, *pv;
fopen_s(&pic, "C:/Users/哈哈哈/Desktop/down.yuv", "rb");
fopen_s(&py, "C:/Users/哈哈哈/Desktop/py.txt", "w");
fopen_s(&pu, "C:/Users/哈哈哈/Desktop/pu.txt", "w");
fopen_s(&pv, "C:/Users/哈哈哈/Desktop/pv.txt", "w");

unsigned char Array[98304];
fread(Array,1,Res*1.5,pic);
for (int i=0;i<Res;i++)
{
    Y[i]=*(Array+i);
}

for (int i=Res;i<Res*1.25;i++)
{
    U[i-65536]=*(Array+i);
}

for (int i=Res*1.25;i<Res*1.5;i++)
{
    V[i-81920]=*(Array+i);
}

for (int i=0;i<Res;i++)
{
    Y1[Y[i]]++;
}

for (int i=0;i<(Res/4);i++)
{
	U1[U[i]]++; 
	V1[V[i]]++;
}

for (int i=0;i<256;i++)
{
	Y1[i] = Y1[i] / (Res);
    U1[i] = U1[i] / (Res/4);
    V1[i] = V1[i] / (Res/4);
}

for (int i=0;i<256;i++)
{
	fprintf(py, "%d\t%f\n", i, Y1[i]);
    fprintf(pu, "%d\t%f\n", i, U1[i]);
    fprintf(pv, "%d\t%f\n", i, V1[i]);
}

for (int i=0;i<256;i++)
{
	if (Y1[i]!=0) 
	{
		Y2+=-Y1[i]*log(Y1[i])/log(double(2));
	}
    if (U1[i]!=0)
	{
		U2+=-U1[i]*log(U1[i])/log(double(2)); 
	}
    if (V1[i]!=0)
	{
		V2+=-V1[i]*log(V1[i])/log(double(2)); 
	}
}
printf("Y的熵为%f\n", Y2);
printf("U的熵为%f\n", U2);
printf("V的熵为%f\n", V2);

system("pause");

return 0;

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值