作业内容
对群里发的down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵。(编程实现)
两个文件的分辨率均为256*256,yuv为4:2:0采样空间,存储格式为:rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。
思路
- 分析各分量的点数,yuv分别是65536、16384、16384,rgb分别是65536、65536、65536。定义与点数对应的数组,并从原文件中读取各像素的数据。
- 注意读取数据时,yuv与rgb存储顺序不相同、rgb格式是按照BGR的顺序存放的。
- 统计个灰度级的像素数量,并计算各灰度级的概率分布。
- 累加计算各分量的熵。
- 导出为TXT文档,使用MATLAB绘制概率分布二维图像。
实验中遇到的问题及解决方法
- 对.yuv文档的打开、读取、关闭等操作参考上学期数字视音频处理课程《直方图均衡实验》。
- 计算熵时最开始一直报错 C2668: “log”: 对重载函数的调用不明确 ,查找资料后将log(2) 修改为log((double)(2.0)),程序就可以运行了。
- 用VS绘制二维图很困难,就把概率数据写到TXT文档,再复制黏贴到MATLAB,作为一个数组绘制概率分布二维图就简单很多。
编程实现
YUV
# include <iostream>
# include <stdio.h>
using namespace std;
int main()
{
unsigned char* YUV_buffer_in = new unsigned char[98304]; //256*256*1.5
// 打开与读取文件
FILE* fp ;
fopen_s(&fp , "D:\\down.yuv","rb");
fread(YUV_buffer_in, 1, 98304, fp);
fclose(fp);
unsigned char* y_buffer = new unsigned char[65536];
unsigned char* u_buffer = new unsigned char[16384];
unsigned char* v_buffer = new unsigned char[16384];
double y_frequency[256] = {
0 } ,u_frequency[256] = {
0 } ,v_frequency[256] = {
0 } ;
double y_h = 0 ,u_h = 0 ,v_h = 0 ;
//读取
for (int i = 0; i < 65536; i++)
{
y_buffer[i] = YUV_buffer_in[i];//0~256*256-1为y分量
}
for (int i = 0; i < 16384; i++)
{
u_buffer[i] = YUV_buffer_in[i + 65536];//256*256~256*256*1.25-1为u分量
}
for (int i = 0; i < 16384; i++)
{
v_buffer[i] = YUV_buffer_in[i