1.实验基本原理
RGB2YUV转换公式:
Y=0.2990*R+0.5870*G+0.1140*B
U=-0.1684*R-0.3316*G+0.5*B+128
V=0.5*R-0.4187*G-0.813*B+128
YUV2RGB转换公式:
B=Y+1.779(U-128)
G=Y-0.7169(V-128)-0.3455(U-128)
R=Y+1.14075(V-128)
YUV文件格式:
YUV按照4:2:0的方式取样,即色度信号在水平方向和垂直方向的取样频率是亮度信号的1/4。
先存储一帧中的所有Y数据,接着存储一帧中所有的U数据,再存储所有的V数据。
所占空间大小:weight*height*1(Y)+weight*height/4(U)+weight*height/4(V)=weight*height*3/2(byte)
RGB文件格式:
RGB按照4:4:4的方式取样。
顺序存储每一像素点的B,G,R数据。
所占空间大小:weight*height*1(B)+weight*height*1(G)+weight*height*1(R)=weight*height*3(byte)
因为两种文件格式大小不一样,所以在RGB转YUV时色差信号需要下采样,即经公式转换后,每相邻四个U值取平均作为最终U值进行存储。V同理。反之,在YUV转RGB时,每个色差信号值需作为相邻4个像素的U,V值,即上采样。
关于数据溢出:
由于RGB文件是8bit量化,而YUV文件经公式转化后数值有可能超出0~255范围,数据溢出(如256会变为0)会造成图像部分地方颜色显示错误。可以通过设置double型(字节数比unsigned char型多)中间变量存放转换结果,再通过if语句判断是否超出范围来确定R,G,B的最终值,防止数据溢出。
关于main函数:
带参数的main函数书写:int main(int argc,char* argv[ ])
其中argc为送入参数的个数,本实验中为5个;
argv[0]-->yuv2rgb.exe(缺省)
argv[1]-->up.yuv(输入文件)
argv[2]-->up.rgb(生成文件)
argv[3]-->256(输入文件宽)
argv[4]-->256(输入文件高)
具体操作:
项目属性-->配置属性-->调试-->更改参数命令和工作目录(文件打开路径)
关于输出: