RGB与YUV格式的转换

一、实验原理:

1.图像数据存储方式

图像中RGB以像素为单位,存储顺序为B、G、R
YUV以整幅图为单位,先存Y,亮度分量,再存U、V,色差分量
分别提取rgb图片和yuv图片的RGB与YUV数值,通过转换公式,即可得到另一种图像格式所需数值,再写入新图像,即可转换图像格式。

2.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

R=Y+(R-Y)=Y+1.14075(V-128)
G=Y+ (G-Y)=Y-0.7169(V-128)-0.3455(U-128)
B=Y+ (B-Y)=Y+1.779(U-128)

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

  • 亮电平信号量化后码电平分配
    在对分量信号进行8比特均匀量化时,共分为256个等间隔的量化级。为了防止信号变动造成过载,在256级上端留20级,下端留16级作为信号超越动态范围的保护带。
  • 色差信号量化后码电平分配
    色差信号经过归一化处理后,动态范围为-0.5-0.5,让色差零电平对应码电平128,色差信号总共占225个量化级。在256级上端留15级,下端留16级作为信号超越动态范围的保护带。

4.色度格式

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

二:实验代码

rgb转yuv:

#include 
#include 
#include 	

int Height = 256;
int Width = 256;

int main(int argc, char** argv)

{
	FILE* rgbFile = NULL;
	FILE* yuvFile = NULL;


	char

你可能感兴趣的:(RGB与YUV格式的转换)