编程实现对rgb和yuv的概率及信息熵的分析
*已知文件down.rgb和down.yuv两个文件
- 分辨率均为256*256
- YUV为4:2:0采样空间
- 存储格式为:
RGB文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放
注:
数字电视系统基于三基色原理工作,图像源把彩色场景或图像转换为**红(R)、绿(G)和蓝(B)**三个模拟基色视频信号,将这三个基色信号数字化后,经种种处理,传送给终端。**YUV(亦称YCrCb)**是被欧洲电视系统所采用的一种颜色编码方法(属于PAL)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma)。
与RGB视频信号传输相比,它最大的优点在于只需占用极少的带宽(RGB要求三个独立的视频信号同时传输)。
在水平和垂直方向上,两个色差信号取样点数,都减少到亮度信号取样点数的一半,即4个亮度信号取样点,对应两个色差信号的各一个取样点,称为4:2:0格式
一、实验目的
已知文件down.rgb和down.yuv两个文件,通过编程分析二者的三个通道的概率分布,并计算各自的熵。
二、实验流程
-
打开、创建所需文件
-
定义文件读取、存储数组
-
计算三通道数值的出现概率
-
定义并求解三通道信源熵
-
将数据导入matlab,绘制概率分布图
三、实验代码
1.RGB代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main()
{
int w = 256;
int h = 256;
int fileLength = w * h * 3;
//打开、创建所需文件
FILE* file = fopen("down.rgb", "rb");
//动态分配地址
unsigned char* dataArray = (unsigned char*)malloc(sizeof(unsigned char) * fileLength);
unsigned char* r = (unsigned char*)malloc(w * h * sizeof(unsigned char));
unsigned char* g = (unsigned char*)malloc(w * h * sizeof(unsigned char));
unsigned char* b = (unsigned char*)malloc(w * h * sizeof(unsigned char));
//读取文件
fread(dataArray, sizeof(unsigned char), fileLength, file);
//定义不同颜色通道计数
int k = 0;
int m = 0; //b
int n = 0; //g
int p = 0; //r
//定义参照数组跟三通道计数数组
unsigned char item[256];
double countR[256];
double countG[256];
double countB[256];
for (int i = 0; i < 256; i++)
{
item[i] = (unsigned char)i