一、实验目的
对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