作业要求
对群里发的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;
}