对down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵。两个文件的分辨率均为256*256,yuv为4:2:0采样空间,存储格式为:rgb文件按每个像素BGR分量依次存放;YUV格

一、实验目的

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

二、实验思路

1.定义变量,countB[i]代表B的在横坐标i的的数量,dataB为B的概率分布,entropyB为B的熵。
2.读取内容,利用fopen读取down.rgb和down.yuv的内容。
3.对BGR/YUV进行计数,down.rgb,down.yuv中的数据值对应BGR的坐标,每一个非0数据值的读取,对应坐标的值相加。
4.计算并输出,各计数依次除以BGR总个数(对与YUV格式,由于4:2:0的制式,U、V总个数为Y的四分之一),算出BGR概率分布。按照公式算出BGR的熵。并输出。
5.释放空间,fclose、free释放空间。
6.绘制图像将得到文件内容复制,用matlab绘制出各通道的概率分布曲线。

三、实验代码

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

#include <iostream>
#include <stdio.h>
using namespace std;
#define width 256
#define height 256
int main()
{
    int size=width*height;
    int sum=size*3;
    FILE *fp=fopen("D:/微信文件/数据压缩/homework1/down.rgb", "r");
    FILE *fp_out=fopen("D:/微信文件/数据压缩/homework1/rgbdata.txt", "wb");
    unsigned char* get;
    get=(unsigned char*)malloc(sizeof(unsigned char)*sum);
    double countB[256]={0};
    double countG[256]={0};
    double countR[256]={0};
    double dataB;
    double dataG;
    double dataR;
	int i=0;
	double entropyB=0;
	double entropyG=0;
	double entropyR=0;
    fread(get, sizeof(unsigned char), sum, fp);
	
	 for (i=0;i<sum;i=i+3)
   {
      countB[get[i]]++;
      countG[get[i+1]]++;
      countR[get[i+2]]++;
   }
	
    for(i=0;i<256;i++)
    {
        dataB=countB[i]/size;
		if (dataB!=0)
			entropyB=entropyB+dataB*(log(1/dataB)/log(2.0));
        fprintf(fp_out, "%f",dataB);
        fprintf(fp_out, " ");

        dataG=countG[i]/size;
		if (dataG!=0)
			entropyG=entropyG+dataG*(log(1/dataG)/log(2.0));
        fprintf(fp_out, "%f",dataG);
        fprintf(fp_out, " ");

        dataR=countR[i]/size;
		if (dataR!=0)
			entropyR=entropyR+dataR*(log(1/dataR)/log(2.0));
        fprintf(fp_out, "%f\n",dataR);
    }
	fprintf(fp_out, "%f\n",entropyB);
	fprintf(fp_out, "%f\n",entropyG);
	fprintf(fp_out, "%f\n",entropyR);
    fclose(fp);
    fclose(fp_out);
    free(get);
    return 0;
}

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

#include <iostream>
#include <stdio.h>
using namespace std;
#define width 256
#define height 256
int main()
{
    int size=width*height;
    int sum=size*1.5;
    FILE *fp=fopen("D:/微信文件/数据压缩/homework1/down.yuv", "r");
    FILE *fp_out=fopen("D:/微信文件/数据压缩/homework1/yuvdata.txt", "wb");
    unsigned char* get;
    get=(unsigned char*)malloc(sizeof(unsigned char)*sum);
    double countY[256]={0};
    double countU[256]={0};
    double countV[256]={0};
    double dataY;
    double dataU;
    double dataV;
	double entropyY=0;
	double entropyU=0;
	double entropyV=0;
    fread(get, sizeof(unsigned char), sum, fp);
    for(int i=0;i<sum;i++)
    {
        int j=get[i];
        if(i<size)
        {
            countY[j]++;
        }
        else if (i<(size*5/4))
        {
            countU[j]++;
        }
        else
        {
            countV[j]++;
        }
    }
	for(int i=0;i<256;i++)
    {
        dataY=countY[i]/size;
		if (dataY!=0)
			entropyY=entropyY+dataY*(log(1/dataY)/log(2.0));
        fprintf(fp_out, "%f",dataY);
        fprintf(fp_out, " ");

        dataU=4*countU[i]/size;
		if (dataU!=0)
			entropyU=entropyU+dataU*(log(1/dataU)/log(2.0));
        fprintf(fp_out, "%f",dataU);
        fprintf(fp_out, " ");

        dataV=4*countV[i]/size;
		if (dataV!=0)
			entropyV=entropyV+dataV*(log(1/dataV)/log(2.0));
        fprintf(fp_out, "%f\n",dataV);
    }
	fprintf(fp_out, "%f\n",entropyY);
	fprintf(fp_out, "%f\n",entropyU);
	fprintf(fp_out, "%f\n",entropyV);
    fclose(fp);
    fclose(fp_out);
    free(get);
    return 0;
}

四、实验结果

运用matlab绘制出BGR通道的概率分布
其中蓝线为B的概率分布,红线为G的概率分布,黄线为R的概率分布
在这里插入图片描述

BGR的熵分别为6.856861,7.178462,7.229553
在这里插入图片描述

运用matlab绘制出YUV通道的概率分布
其中蓝线为Y的概率分布,红线为U的概率分布,黄线为V的概率分布
在这里插入图片描述
yuv的熵分别为6.331819,5.126402,4.113143
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值