要求
对群里发的down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵。
提示
两个文件的分辨率均为256*256,yuv为4:2:0采样空间,存储格式为:rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。
代码
#include<iostream>
#include<fstream>
using namespace std;
#define height 256
#define width 256
#define size 65536
void H_RGB(unsigned char* buffer)
{
FILE* fp;
float level_r[256] = { 0 };
float level_g[256] = { 0 };
float level_b[256] = { 0 };
float Hr = 0, Hg = 0, Hb = 0;
fopen_s(&fp, "C:\\Users\\tonym\\Desktop\\down.rgb", "rb");
if (fp == 0)
return;
fread(buffer, size * 3, 1, fp);
for (int i = 0; i < size * 3; i)
{
level_b[buffer[i++]] ++;
level_g[buffer[i++]] ++;
level_r[buffer[i++]] ++;
}
for (int i = 0; i < 256; i++)
{
if (level_b[i] / 65536 != 0)
Hb = Hb - (level_b[i] / 65536) * (log(level_b[i] / 65536) / (log(2)) );
if (level_g[i] / 65536 != 0)
Hg = Hg - (level_g[i] / 65536) * (log(level_g[i] / 65536) / (log(2)) );
if (level_r[i] / 65536 != 0)
Hr = Hr - (level_r[i] / 65536) * (log(level_r[i] / 65536) / (log(2)) );
}
printf("Hr=%f\nHg=%f\nHb=%f\n", Hr, Hg, Hb);
}
float H_YUV(unsigned char* buffer,int len)
{
float level[256] = { 0 };
float H=0;
for (int i = 0; i < len; i)
{
level[buffer[i++]] ++;
}
for (int i = 0; i < 256; i++)
{
if (level[i] / len != 0)
H = H - (level[i] / len) * (log(level[i] / len) / (log(2)));
}
return H;
}
int main()
{
int level_RGB[256] = { 0 };
float sum_RGB[256];
unsigned char* RGB_buffer;
unsigned char* YUV_buffer1, * YUV_buffer2, * YUV_buffer3;
RGB_buffer = new unsigned char[size * 3];
YUV_buffer1 = new unsigned char[size];
YUV_buffer2 = new unsigned char[size/4];
YUV_buffer3 = new unsigned char[size/4];
FILE* fp_yuv;
fopen_s(&fp_yuv, "C:\\Users\\tonym\\Desktop\\down.yuv", "rb");
if (fp_yuv == 0)
return 0;
fread(YUV_buffer1, 65536, 1, fp_yuv);
fread(YUV_buffer2, 16384, 1, fp_yuv);
fread(YUV_buffer3, 16384, 1, fp_yuv);
H_RGB(RGB_buffer);
printf("Hy=%f\n", H_YUV(YUV_buffer1, 65536));
printf("Hu=%f\n", H_YUV(YUV_buffer2, 16384));
printf("Hv=%f\n", H_YUV(YUV_buffer3, 16384));
return 0;
}
结果
分析
yuv文件中各分量的熵小于rgb中各分量的熵,说明rgb文件虽然体积大于4:2:0采样格式的yuv文件但所含信息量的密度更高。