数据压缩作业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数据块依次存放。

实验过程

存储格式:
rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。先Y,后V,中间是U。其中的Y是w * h,U和V是w/2 * (h/2)
信息熵计算公式:H(x) = -∑P(x)logP(x)

1.rgb文件

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

unsigned char rgb[196608];
unsigned char r[65536];
unsigned char g[65536];
unsigned char b[65536];
double r_f[256] = { 0 };
double g_f[256] = { 0 };
double b_f[256] = { 0 };
double r_s = 0, g_s = 0, b_s = 0;
int i,j;

int main( )
{
	
    FILE* down_rgb,* red,* green,* blue;
    fopen_s(&down_rgb,"down.rgb", "rb");
    fopen_s(&red,"D:\\shujuyasuo\\red.txt", "w");
    fopen_s(&green,"D:\\shujuyasuo\\green.txt", "w");
    fopen_s(&blue, "D:\\shujuyasuo\\blue.txt", "w");

	fread(rgb, sizeof(unsigned char), 196608, down_rgb);
	for (i = 0, j = 0; i < 196608; i=i+3,j++)
    {
        b[j] = rgb[i];
        g[j] = rgb[i + 1];
        r[j] = rgb[i + 2];
    }

	//计数
for (int i = 0; i < 256; i++)
{
    for (int j = 0; j < 65536; j++)
    {
        if (r[j] == i)
        {r_f[i]++;}
        if (g[j] == i)
        {g_f[i]++;}
        if (b[j] == i)
        {b_f[i]++;}
    }
}

	//频率
	for (int i = 0; i < 256; i++)
	{
		r_f[i] = r_f[i] / double(65536);
		g_f[i] = g_f[i] / double(65536);
		b_f[i] = b_f[i] / double(65536);
	}

//求信息熵
for (int i = 0; i < 256; i++)
 {
  if (r_f[i] != 0) {r_s += -r_f[i] * log(r_f[i]) / log(double(2));}
  if (g_f[i] != 0) {g_s += -g_f[i] * log(g_f[i]) / log(double(2));}
  if (b_f[i] != 0) {b_s += -b_f[i] * log(b_f[i]) / log(double(2));}
 }

    cout << "R熵为" << r_s << endl;
    cout << "G熵为" << g_s << endl;
    cout << "B熵为" << b_s << endl;

	for (int i = 0; i < 256; i++)
	{
		fprintf(red, "%f\n",r_f[i]);
		fprintf(green, "%f\n",g_f[i]);
		fprintf(blue, "%f\n",b_f[i]);
	}

    fclose(red);
    fclose(green);
    fclose(blue);
    fclose(down_rgb);
    system("pause");
    return 0;
}

实验结果如下:
在这里插入图片描述
利用matlab将txt数据转化为图像 概率分布图
在这里插入图片描述
2.yuv文件

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

unsigned char yuv[196608];
unsigned char y_n[65536];
unsigned char u_n[16384];
unsigned char v_n[16384];
double y_f[256] = { 0 };
double u_f[256] = { 0 };
double v_f[256] = { 0 };
double y_s = 0, u_s = 0, v_s = 0;
int i,j;

int main( )
{
	
    FILE* down_yuv,* y,* u,* v;
    fopen_s(&down_yuv,"down.yuv", "rb");
    fopen_s(&y,"D:\\shujuyasuo\\y.txt", "w");
    fopen_s(&u,"D:\\shujuyasuo\\u.txt", "w");
    fopen_s(&v, "D:\\shujuyasuo\\v.txt", "w");

	fread(yuv, sizeof(unsigned char), 196608, down_yuv);
	for (int i = 0, j = 0; i < 65536; i++, j++)
		{
			y_n[j] = yuv[i];
		}
		for (int i = 65536, j = 0; i < 81920; i++, j++)
		{
			u_n[j] = yuv[i];
		}
		for (int i = 81920, j = 0; i < 98304; i++, j++)
		{
			v_n[j] = yuv[i];
		}

	//计数
    for (int i = 0; i < 256; i++)
    {
        for (int j = 0; j < 65536; j++)
        {
            if (y_n[j] == i)
            {y_f[i]++;}
        }
        for (int k = 0; k < 16384; k++)
        {
            if (u_n[k] == i)
            {u_f[i]++;}
        }
        for (int n = 0; n < 16384; n++)
        {
            if (v_n[n] == i)
            {v_f[i]++;}
        }
    }

	//频率
	for (int i = 0; i < 256; i++)
	{
		y_f[i] = y_f[i] / double(65536);
		u_f[i] = u_f[i] / double(16384);
		v_f[i] = v_f[i] / double(16384);
	}

//求信息熵
for (int i = 0; i < 256; i++)
 {
  if (y_f[i] != 0) {y_s += -y_f[i] * log(y_f[i]) / log(double(2));}
  if (u_f[i] != 0) {u_s += -u_f[i] * log(u_f[i]) / log(double(2));}
  if (v_f[i] != 0) {v_s += -v_f[i] * log(v_f[i]) / log(double(2));}
 }

    cout << "y熵为" << y_s << endl;
    cout << "u熵为" << u_s << endl;
    cout << "v熵为" << v_s << endl;

	for (int i = 0; i < 256; i++)
	{
		fprintf(y, "%f\n",y_f[i]);
		fprintf(u, "%f\n",u_f[i]);
		fprintf(v, "%f\n",v_f[i]);
	}

    fclose(y);
    fclose(u);
    fclose(v);
    fclose(down_yuv);
    system("pause");
    return 0;
}

实验结果如下:
在这里插入图片描述
利用matlab将txt数据转化为图像 概率分布图
在这里插入图片描述

结果分析

rgb的分量的熵大于yuv的分量的熵,yuv分布更不均匀,熵更小,比rgb的可压缩程度大。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值