【数据压缩1】计算RGB的熵

题目要求
编程实现RGB文件三通道分量的熵计算。
该测试文件分辨率为256×256,数据格式为每个像素占用3字节,BGRBGR…保存。拿到文件可以先计算一下文件大小是否为宽×高×3字节。

熵的计算公式
在这里插入图片描述
cpp代码实现

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#pragma warning(disable:4996); 

int main()
{
	FILE* test;//设置文件指针
	test = fopen("D://作业//shujuyasuo//作业1//test.rgb", "rb");//打开文件

	unsigned char buffer[256 * 256 * 3];//每个像素3字节,共256*256*3字节
	fread(buffer, 1, 256 * 256 * 3, test);

	//RGB分量
	unsigned char R[256 * 256] = { 0 };
	unsigned char G[256 * 256] = { 0 };
	unsigned char B[256 * 256] = { 0 };
	//RGB数量
	double Rnum[256] = { 0 };
	double Gnum[256] = { 0 };
	double Bnum[256] = { 0 };
	//RGB频率
	double fr[256] = { 0 };
	double fg[256] = { 0 };
	double fb[256] = { 0 };
	//RGB熵
	double sr = 0;
	double sg = 0;
	double sb = 0;

	//文件按BGR BGR排列,按照顺序将文件中对应的分量进行存储
	for (int i = 0, j = 0; j < 256 * 256 * 3; i++, j = j + 3)
	{
		B[i] = *(buffer + j);//j
		G[i] = *(buffer + j + 1);//j+1
		R[i] = *(buffer + j + 2);//j+2
	}

	//计算分量的数量
	for (int i = 0; i < 256; i++)
	{
		for (int j = 0; j < 256 * 256; j++)
		{
			if (int(R[j] == i))//j遍历,与i相同存储,可计算分量数量
			{
				Rnum[i]++;
			}
			if (int(G[j] == i))
			{
				Gnum[i]++;
			}
			if (int(B[j] == i))
			{
				Bnum[i]++;
			}
		}
	}

	//计算各分量的频率
	for (int i = 0; i < 256; i++)
	{
		fr[i] = Rnum[i] / (256 * 256);
		fg[i] = Gnum[i] / (256 * 256);
		fb[i] = Bnum[i] / (256 * 256);
	}
	//计算分量的熵,用公式计算
	for (int i = 0; i < 256; i++)
	{
		if (fr[i] != 0)
		{
			sr += -fr[i] * log(fr[i]) / log(double(2));
		}
		if (fg[i] != 0)
		{
			sg += -fg[i] * log(fg[i]) / log(double(2));
		}
		if (fb[i] != 0)
		{
			sb += -fb[i] * log(fb[i]) / log(double(2));
		}
	}

	cout << "R的熵为:" << sr << endl;
	cout << "G的熵为:" << sg << endl;
	cout << "B的熵为:" << sb << endl;

	return 0;
}

结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值