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

本文档详细介绍了对down.rgb和down.yuv文件中RGB和YUV三个通道的概率分布进行分析的过程。首先,明确了各通道的点数,接着通过编程读取并统计各灰度级像素数量,计算概率分布。在实验中,解决了关于.yuv文件读取和熵计算的错误。最后,使用MATLAB绘制了RGB和YUV的概率分布二维图像。
摘要由CSDN通过智能技术生成

作业内容
对群里发的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值