实验目标
使用c以及c++语言编写色彩空间的转换,利用YUV文件转换为RGB文件并比较不同。
实验原理
1.YUV与RGB空间的相互转换
由电视原理可知,亮度和色差信号的构成如下:
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
2.在对分量信号进行8比特均匀量化时,共分为256个等间隔的量化级。为了防止信号变动造成过载,在256级上端留20级,下端留16级作为信号超越动态范围的保护带。色差信号经过归一化处理后,动态范围为-0.5-0.5,让色差零电平对应码电平128,色差信号总共占225个量化级。在256级上端留15级,下端留16级作为信号超越动态范围
的保护带。
3.色度格式
4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方向和垂直方向上的取样点数均为Y的一半。
实验代码
主代码
#include <stdio.h>
#include <stdlib.h>
#include "yuv2rgb.h"
int main(int argc, const char * argv[])
{
FILE *yuv = NULL;
FILE *rgb = NULL;//建立文件
fopen_s(&yuv, "D://down.yuv_out", "rb");
fopen_s(&rgb, "D://down.rgb", "wb");//打开文件
unsigned long Height=256, Width=256;
int buf_yuv = Height*Width+Height*Width/4+Height*Width/4;;//使用一个一维buffer存储yuv文件
unsigned char *bufferyuv;
int *buf_r, *buf_g, *buf_b;
bufferyuv = (unsigned char *)malloc(buf_yuv);
buf_r = (int *)malloc(sizeof(int)* Height*Width);
buf_b = (int *)malloc(sizeof(int)* Height*Width);
buf_g = (int *)malloc(sizeof(int)* Height*Width);
fread(bufferyuv, 1, buf_yuv, yuv);//读入数据
yuv2rgb(Height,Width,buffer