一.实验目的
通过对所给rgb文件以及yuv文件三个通道进行分析,分别计算出各自的概率以及对应的熵,由此来判断压缩时选择什么文件更利于文件的压缩。
二.实验思路
1.rgb文件所给的内容是按照BGRBGRBRG…的方式排列,首先读取文件将文件完全展开变为一个256×256×3一维数组,由于每一位都是由8bit组成,即RGB每种颜色都有256种色号,将单独每一路通道的颜色取出,即变成3个256×256的一维数组,通过对数组的遍历对每一种色号进行统计计算出每种色号的概率,从而得到其熵值。(由于程序中不方便对公式直接进行输入,可以使用对数恒等式进行计算)。
计算公式
H(x) = E[I(xi)] = E[ log(2,1/P(xi)) ] = -∑P(xi)log(2,P(xi)) (i=1,2,…n)
其中,x表示随机变量,与之相对应的是所有可能输出的集合,定义为符号集,随机变量的输出用x表示。P(x)表示输出概率函数。变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大.
2.yuv文件是包含亮度信号Y以及色差信号U.V的文件,文件采用4:2:0格式,即每四个Y分量中会带有一个U分量和一个V分量,即总体大小变为256×256×1.5。只需对代码中的RGB总大小进行修改,就可以得到其YUV的熵值.由于排列方式的不同,也要对yuv分量提取部分进行相应改动.
三.实验代码
RGB文件的计算
#include<stdio.h>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int height = 256;
int width = 256;
int size, i, j;
size = height * width;
FILE* fp1;
unsigned char r[65535] = {
0 };
unsigned char g[65535] = {
0 };
unsigned char b[65535] = {
0 };//R、G、B分量
double pr[255] = {
0 };
double pg[255] = {
0 };
double pb[255] = {
0 };//8bit有256种色号
double hr = 0, hg = 0, hb = 0; //RGB的熵
fopen_s(&fp1, "d://down.rgb", "rb");
unsigned char a[196608];//三通道共有256*256*3
fread(a, sizeof(unsigned char), 196608, fp1);//读取文件
for (i = 0, j