实验目的
分析down.rgb和down.yuv三个通道的概率分布,并计算各自的熵。两个文件的分辨率均为256*256,yuv为4:2:0采样空间,存储格式为:rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。
实验过程
存储格式:
rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。先Y,后V,中间是U。其中的Y是w * h,U和V是w/2 * (h/2)
信息熵计算公式:H(x) = -∑P(x)logP(x)
1.rgb文件
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
unsigned char rgb[196608];
unsigned char r[65536];
unsigned char g[65536];
unsigned char b[65536];
double r_f[256] = { 0 };
double g_f[256] = { 0 };
double b_f[256] = { 0 };
double r_s = 0, g_s = 0, b_s = 0;
int i,j;
int main( )
{
FILE* down_rgb,* red,* green,* blue;
fopen_s(&down_rgb,"down.rgb", "rb");
fopen_s(&red,"D:\\shujuyasuo\\red.txt", "w");
fopen_s(&green,"D:\\shujuyasuo\\green.txt", "w");
fopen_s(&blue, "D:\\shujuyasuo\\blue.txt", "w");
fread(rgb, sizeof(unsigned char), 196608, down_rgb);
for (i = 0, j = 0; i < 196608; i=i+3,j++)
{
b[j] = rgb[i];
g[j] = rgb[i + 1];
r[j] = rgb[i + 2];
}
//计数
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (r[j] == i)
{r_f[i]++;}
if (g[j] == i)
{g_f[i]++;}
if (b[j] == i)
{b_f[i]++;}
}
}
//频率
for (int i = 0; i < 256; i++)
{
r_f[i] = r_f[i] / double(65536);
g_f[i] = g_f[i] / double(65536);
b_f[i] = b_f[i] / double(65536);
}
//求信息熵
for (int i = 0; i < 256; i++)
{
if (r_f[i] != 0) {r_s += -r_f[i] * log(r_f[i]) / log(double(2));}
if (g_f[i] != 0) {g_s += -g_f[i] * log(g_f[i]) / log(double(2));}
if (b_f[i] != 0) {b_s += -b_f[i] * log(b_f[i]) / log(double(2));}
}
cout << "R熵为" << r_s << endl;
cout << "G熵为" << g_s << endl;
cout << "B熵为" << b_s << endl;
for (int i = 0; i < 256; i++)
{
fprintf(red, "%f\n",r_f[i]);
fprintf(green, "%f\n",g_f[i]);
fprintf(blue, "%f\n",b_f[i]);
}
fclose(red);
fclose(green);
fclose(blue);
fclose(down_rgb);
system("pause");
return 0;
}
实验结果如下:
利用matlab将txt数据转化为图像 概率分布图
2.yuv文件
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
unsigned char yuv[196608];
unsigned char y_n[65536];
unsigned char u_n[16384];
unsigned char v_n[16384];
double y_f[256] = { 0 };
double u_f[256] = { 0 };
double v_f[256] = { 0 };
double y_s = 0, u_s = 0, v_s = 0;
int i,j;
int main( )
{
FILE* down_yuv,* y,* u,* v;
fopen_s(&down_yuv,"down.yuv", "rb");
fopen_s(&y,"D:\\shujuyasuo\\y.txt", "w");
fopen_s(&u,"D:\\shujuyasuo\\u.txt", "w");
fopen_s(&v, "D:\\shujuyasuo\\v.txt", "w");
fread(yuv, sizeof(unsigned char), 196608, down_yuv);
for (int i = 0, j = 0; i < 65536; i++, j++)
{
y_n[j] = yuv[i];
}
for (int i = 65536, j = 0; i < 81920; i++, j++)
{
u_n[j] = yuv[i];
}
for (int i = 81920, j = 0; i < 98304; i++, j++)
{
v_n[j] = yuv[i];
}
//计数
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (y_n[j] == i)
{y_f[i]++;}
}
for (int k = 0; k < 16384; k++)
{
if (u_n[k] == i)
{u_f[i]++;}
}
for (int n = 0; n < 16384; n++)
{
if (v_n[n] == i)
{v_f[i]++;}
}
}
//频率
for (int i = 0; i < 256; i++)
{
y_f[i] = y_f[i] / double(65536);
u_f[i] = u_f[i] / double(16384);
v_f[i] = v_f[i] / double(16384);
}
//求信息熵
for (int i = 0; i < 256; i++)
{
if (y_f[i] != 0) {y_s += -y_f[i] * log(y_f[i]) / log(double(2));}
if (u_f[i] != 0) {u_s += -u_f[i] * log(u_f[i]) / log(double(2));}
if (v_f[i] != 0) {v_s += -v_f[i] * log(v_f[i]) / log(double(2));}
}
cout << "y熵为" << y_s << endl;
cout << "u熵为" << u_s << endl;
cout << "v熵为" << v_s << endl;
for (int i = 0; i < 256; i++)
{
fprintf(y, "%f\n",y_f[i]);
fprintf(u, "%f\n",u_f[i]);
fprintf(v, "%f\n",v_f[i]);
}
fclose(y);
fclose(u);
fclose(v);
fclose(down_yuv);
system("pause");
return 0;
}
实验结果如下:
利用matlab将txt数据转化为图像 概率分布图
结果分析
rgb的分量的熵大于yuv的分量的熵,yuv分布更不均匀,熵更小,比rgb的可压缩程度大。