分离rgb文件中RGB分量,计算其概率分布及熵

代码

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;

int Height = 256;
int Width = 256;

int main()
{
	unsigned char R[65536] = { 0 };
	unsigned char G[65536] = { 0 };
	unsigned char B[65536] = { 0 };
	//R、G、B分量

	double fre_R[256] = { 0 };
	double fre_G[256] = { 0 };
	double fre_B[256] = { 0 };
	//计算频率

	double entropy_R = 0;
	double entropy_G = 0;
	double entropy_B = 0;
	//计算分量的熵

	FILE* Image;
	fopen_s(&Image, "C:\\杂七杂八\\down.rgb", "rb");
	//打开rgb文件
	
	FILE* Red;
	FILE* Green;
	FILE* Blue;
	fopen_s(&Red, "C:\\杂七杂八\\Red.txt", "w");
	fopen_s(&Green, "C:\\杂七杂八\\Green.txt", "w");
	fopen_s(&Blue, "C:\\杂七杂八\\Blue.txt", "w");
   //创建新的txt文件	

	unsigned char buffer[196608];
	fread(buffer, 1,196607, Image);

	for (int i = 0, j = 0; i < 196608; i = i + 3, j++)
	{
		B[j] = *(buffer + i);
		G[j] = *(buffer + i + 1);
		R[j] = *(buffer + i + 2);
		//分别读取R、G、B三个分量到数组中
	}

	for (int i = 0; i < 256; i++)
	{
		for (int j = 0; j < 65536; j++)
		{
			if (int(R[j] == i))
			{
				fre_R[i]++;
			}
		}
	}

	for (int i = 0; i < 256; i++)
	{
		for (int j = 0; j < 65536; j++)
		{
			if (int(G[j] == i))
			{
				fre_G[i]++;
			}
		}
	}

	for (int i = 0; i < 256; i++)
	{
		for (int j = 0; j < 65536; j++)
		{
			if (int(B[j] == i))
			{
				fre_B[i]++;
			}
		}
	}
	for (int i = 0; i < 256; i++)
	{
		fre_R [i]= fre_R[i] / double(Height*Width);
		fre_B [i]= fre_B[i] / double(Height*Width);
		fre_G [i] = fre_G[i] / double(Height*Width);
	}

	for (int i = 0; i < 256; i++)
	{
			if (fre_R[i] != 0)
			{
				entropy_R += -fre_R[i]*log(fre_R[i]) / log(2);
			}
	}
	for (int i = 0; i < 256; i++)
	{
		if (fre_G[i] != 0)
		{
			entropy_G += -fre_G[i] * log(fre_G[i]) / log(2);
		}
	}
	for (int i = 0; i < 256; i++)
	{
		if (fre_B[i] != 0)
		{
			entropy_B += -fre_B[i] * log(fre_B[i]) / log(2);
		}
	}
	cout << "R的熵为" << entropy_R << endl;
	cout << "G的熵为" << entropy_G << endl;
	cout << "B的熵为" << entropy_B << endl;
	//分别计算R、G、B的频率和熵

	//写入文件
	fprintf(Red, "数值\t概率\n");
	for (int i = 0; i < 256; i++)
	{
		fprintf(Red, "%d\t%f\n", i, fre_R[i]);
	}

    fprintf(Green, "数值\t概率\n");
	for (int i = 0; i < 256; i++)
	{
		fprintf(Green, "%d\t%f\n", i, fre_G[i]);
	}

   fprintf(Blue, "数值\t概率\n");
	for (int i = 0; i < 256; i++)
	{
		fprintf(Blue, "%d\t%f\n", i, fre_B[i]);
	}

	fclose(Image);
	fclose(Red);
	fclose(Green);
	fclose(Blue);
	return 0;
}


在这里插入图片描述
概率:在这里插入图片描述在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值