一、实验原理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