数据压缩 | 作业1.2_针对down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵

针对down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵

一、实验内容

down.rgb文件和down.yuv文件分别分析三个通道的概率分布,并计算各自的熵(编程实现)。
两个文件的分辨率均为256*256,yuv为4:2:0采样空间,存储格式:rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。

二、实验目的

三、编程实现

1、 .rgb文件分析

.rgb 文件分析代码
#include"iostream"
#include"math.h"
#include"windows.h"
#include"stdio.h"
using namespace std;
#define A 256*256

//计算熵的函数
double en(double freq[256])
{
	double en = 0;
	for (int i = 0; i < 256; i++)
	{
		if (freq[i] == 0)
			continue;
		en  = en - freq[i] * log(freq[i])/log(double(2));
	}
	return en;
}

int main()
{
	FILE* Picture, *Red, *Green, *Blue;
	fopen_s(&Picture, "E:/Desktop/down.rgb", "rb");

	unsigned char R[A] = { 0 };
	unsigned char G[A] = { 0 };
	unsigned char B[A] = { 0 };   
	double R1[256] = { 0 }, G1[256] = { 0 }, B1[256] = { 0 };   //定义R、G、B概率分量

	if (Picture == 0)
		cout<<"无法读取图像!"<<endl;
	else
	{
		//分别读取R、G、B到数组中
		unsigned char Arr[A * 3] = { 0 };
		fread(Arr, 1, A * 3, Picture);
		for (int i = 0, j = 0; i < A * 3; i = i + 3, j++)
		{
			R[j] = *(Arr + i + 2);
			G[j] = *(Arr + i + 1);
			B[j] = *(Arr + i);
		}

		//统计频数
		for (int i = 0; i < A; i++)
		{
			R1[R[i]]++;
			G1[G[i]]++;
			B1[B[i]]++;
		}

		//计算rgb概率
		for (int i = 0; i < 256; i++)
		{
			R1[i] = R1[i] / (A);
			B1[i] = B1[i] / (A);
			G1[i] = G1[i] / (A);
		}

		//计算并输出熵
		double enB = 0, enG = 0, enR = 0;
		enR = en(R1);
		enG = en(G1);
		enB = en(B1);
		cout << "R的熵为:" << enR << endl;
		cout << "G的熵为:" << enG << endl;
		cout << "B的熵为:" << enB << endl;

	}
	system("pause");
	return 0;
}
  • 运行结果
    在这里插入图片描述
  • 绘制概率分布图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2、 .yuv文件分析

.yuv 文件分析代码
#include"iostream"
#include"Windows.h"
#include"math.h"
using namespace std;

#define A 256*256

//计算熵的函数
double en(double freq[256])
{
	double en = 0;
	for (int i = 0; i < 256; i++)
	{
		if (freq[i] == 0)
			continue;
		en = en - freq[i] * log(freq[i]) / log(float(2));
	}
	return en;
}

int main()
{
	

	FILE* Picture, *PalY, *PalU, *PalV;
	fopen_s(&Picture, "E:/Desktop/down.yuv", "rb");
	fopen_s(&PalY, "E:/Desktop/PalY.txt", "w");
	fopen_s(&PalU, "E:/Desktop/PalU.txt", "w");
	fopen_s(&PalV, "E:/Desktop/PalV.txt", "w");

	unsigned char Y[A] = { 0 };
	unsigned char U[A / 4] = { 0 };
	unsigned char V[A / 4] = { 0 };    //定义Y、U、V分量,其中4:2:0格式中,width * hight =Y(总和) U = Y / 4   V = Y / 4
	double Y1[256] = { 0 }, U1[256] = { 0 }, V1[256] = { 0 };   //定义Y、U、V概率分量


	if (Picture == 0)
		printf("无法读取图像");
	else
	{
		//分别读取Y、U、V到数组中
		unsigned char Arr[98304];
		fread(Arr, 1, A * 1.5, Picture);
		for (int i = 0; i < A; i++)
		{
			Y[i] = *(Arr + i);
		}

		for (int i = A; i < A * 1.25; i++)
		{
			U[i - 65536] = *(Arr + i);
		}

		for (int i = A * 1.25; i < A * 1.5; i++)
		{
			V[i - 81920] = *(Arr + i);
		}

		//统计频数
		for (int i = 0; i < A; i++)
		{
			Y1[Y[i]]++;
		}

		for (int i = 0; i < (A / 4); i++)
		{
			U1[U[i]]++;
			V1[V[i]]++;
		}

		//计算yuv概率
		for (int i = 0; i < 256; i++)
		{
			Y1[i] = Y1[i] / (A);
			U1[i] = U1[i] / (A / 4);
			V1[i] = V1[i] / (A / 4);
		}

		//计算并输出熵
		double Y2 = 0, U2 = 0, V2 = 0;
		Y2 = en(Y1);
		U2 = en(U1);
		V2 = en(V1);
		cout << "Y的熵为:" << Y2 << endl;
		cout << "U的熵为:" << U2 << endl;
		cout << "V的熵为:" << V2 << endl;

		//将概率写入记事本
		for (int i = 0; i < 256; i++)
		{
			fprintf(PalY, "%d\t%f\n", i, Y1[i]);
			fprintf(PalU, "%d\t%f\n", i, U1[i]);
			fprintf(PalV, "%d\t%f\n", i, V1[i]);
		}
	}
	system("pause");
	return 0;
  • 运行结果
    在这里插入图片描述
  • 绘制概率分布图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

四、实验结果分析

由实验结果可知,.yuv文件三通道的熵均小于.rgb文件三通道的熵。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值