统计rgb与yuv文件中各分量的熵

统计rgb与yuv文件中各分量的熵

要求

对群里发的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文件但所含信息量的密度更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值