数据压缩实验一:yuv转rgb

一、实验原理

1.彩色空间转换的基本思想及转换公式

(1)YUV与RGB空间的相互转换

RGB->YUV基本公式:

Y=0.2990R+0.5870G+0.1140B

R-Y=0.7010R-0.5870G-0.1140B

B-Y=-0.2990R-0.5870G+0.8860B为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为:

U=-0.1684R-0.3316G+0.5B

V=0.5R-0.4187G-0.0813B

YUV->RGB:

R=Y+1.14075(V-128)

G=Y-0.1769(V-128)-0.3455(U-128)

B=Y-1.779(u-128)

2.码电平分配及数字表达式

在对分量信号进行8比特均匀量化时,共分为256个等间隔的量化级,则Y’=Y+128。

色差信号经过归一化处理后,动态范围为-0.5-0.5,让色差零电平对应码电平128,所以RGBàYUV公式中最后U’=U+128,V’=V+128,而YUVàRGB公式中UV也要减去128再做处理。

3.色度格式

YUV4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方向和垂直方向上的取样点数均为Y的一半。

RGB格式中每个像素点R,G,B连续存储,取样格式为4:4:4。

而YUV格式有两大类:planar和packed:对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V;对于packed的YUV格式,每个像素点的Y,U,V是连续存储的。

在此实验中,采取YUVplanar格式。

则在转换过程中,RGB空间每四个像素点需使用同一个色度信号值,不同亮度值进行转换。

二、实验流程

1.  程序初始化(打开两个文件、定义变量和缓冲区等)

2.  读取YUV 文件,抽取YUV 数据写入缓冲区

3.  调用YUV2RGB 的函数实现YUV 到RGB 数据的转换

4.  写RGB 文件

5.  程序收尾工作(关闭文件,释放缓冲区)

三、实验代码及分析

YUV2RGB缓冲区分析

四个缓冲区:y_buf(width*height),u_buf(width*height/4),v_buf(width*height/4),

rgb_buf(width*height*3),分别存放亮度值数据,色差信号数据和输出结果数据。

用指针进行数据操作,实现YUV数据读取与RGB文件写入,具体如以下代码及注释:

main.cpp主要代码
int main(int argc, char** argv)
{
	/* variables controlable from command line */
	u_int frameWidth = 352;			/* --width=<uint> */
	u_int frameHeight = 240;		/* --height=<uint> */
	unsigned int i;

	/* internal variables */
	char* rgbFileName = NULL;
	char* yuvFileName = NULL;
	FILE* rgbFile = NULL;
	FILE* yuvFile = NULL;
	u_int8_t* r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值