分析RGB通道熵:
说明:两个文件的分辨率均为256*256,yuv为4:2:0采样空间,采用8bit量化。
思路:将文件导入,统计各像素点的概率并放入buffer中存储,再利用求熵的公式进行计算。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
FILE* file1, * file2;
unsigned char* buffer0 = new unsigned char[256 * 256 * 1.5];
unsigned char* buffer1 = new unsigned char[256 * 256 * 3];
double y0[256] = { 0 }, u0[256] = { 0 }, v0[256] = { 0 };
double r1[256] = { 0 }, g1[256] = { 0 }, b1[256] = { 0 };
double y = 0.0, u = 0.0, v = 0.0;
double r = 0.0, g = 0.0, b = 0.0;
//打开读取文件夹
fopen_s(&file1, "down.yuv", "rb");
fread(buffer0, sizeof(unsigned char), 256 * 256 * 1.5, file1);
for (int i = 0; i < (256 * 256); i++)
{
y0[buffer0[i]]++;
}
//计算YUV各通道的熵值
for (int j = 0; j < 256; j++)
{
y0[j] = y0[j] / (65536);
if (y0[j] != 0) y = y + y0[j] * log2(1 / y0[j]);
}//Y通道分量(0-256*256)
for (int i = (256 * 256); i < (65536 * 1.25); i++)
{
u0[buffer0[i]]++;
v0[buffer0[i + 16384]]++;
}//U通道分量(256*256-256*256*1.25)
for (int j = 0; j < 256; j++)
{
u0[j] = u0[j] / (65536 * 0.25);
v0[j] = v0[j] / (65536 * 0.25);
if (u0[j] != 0) u = u + u0[j] * log2(1 / u0[j]);
if (v0[j] != 0) v = v + v0[j] * log2(1 / v0[j]);
}//V通道分量(256*256*1.25-256*256*1.5)
//计算RGB的熵值
fopen_s(&file2, "down.rgb", "rb");
fread(buffer1, sizeof(unsigned char), 256 * 256 * 3, file2);
for (int i = 0; i < (256 * 256); i++)
{
r1[buffer1[i * 3]]++;
g1[buffer1[i * 3 + 1]]++;
b1[buffer1[i * 3 + 2]]++;
}
for (int j = 0; j < 256; j++)
{
r1[j] = r1[j] / (65536);
g1[j] = g1[j] / (65536);
b1[j] = b1[j] / (65536);
if (r1[j] != 0) r = r + r1[j] * log2(1 / r1[j]);
if (g1[j] != 0) g = g + g1[j] * log2(1 / g1[j]);
if (b1[j] != 0) b = b + b1[j] * log2(1 / b1[j]);
}
fclose(file1);
fclose(file2);
cout << "H(Y)=" << y << endl;
cout << "H(U)=" << u << endl;
cout << "H(V)=" << v << endl;
cout << "H(R)=" << r << endl;
cout << "H(G)=" << g << endl;
cout << "H(B)=" << b << endl;
return (0);
}
计算结果:
结论:YUV方式的熵更小,压缩结果更优。