YUV、RGB通道熵计算

分析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方式的熵更小,压缩结果更优。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值