日常生活中接触得比较多的是 RGB 色彩空间,所有的颜色可以通过三原色产生,这 三原色 就是 Red (红),Green(绿),Blue(蓝)。但是还有另一种比较常用的色彩空间是 YUV, 用于编码和存储则比较好。
RGB 色彩空间更适合图像采集和显示, YUV 空间用于编码和存储则比较好。在存储和编码之前,RGB 图像要转换为 YUV 图像,而 YUV 图像在 显示之前通常有必要转换回 RGB。无论是 RGB 还是 YUV,他们都是 表达 色彩信息的一种方式
YUV 色彩空间,Y 代表 亮度,U代表色调,V代表色饱和度。 YCbCr ,把它当成是 YUV 就行,实际上 YCbCr 才是比较准确的术语。
经过大量研究实验表明,视觉系统 对 色度 的敏感度 是远小于 亮度的。所以可以对 色度 采用更小的采样率来压缩数据,对亮度采用正常的采样率即可,这样压缩数据不会对视觉体验产生太大的影响。
YUV采样格式
YUV444格式跟RGB相似 一个像素占位是8+8+8=24bit(3个字节)
YUV422格式 一个像素占位是8+8/2+8/2=16bit(2个字节)
YUV420格式 一个像素占位是8+8/2+8*0=12bit(1.5个字节)
例如原始数据有8个像素点
1. YUV444和原数据一样[yuv,yuv,yuv,yuv,yuv,yuv,yuv,yuv] 每像素占位3字节
2. YUV422 数据 [yu,yv,yu,yv,yu,yv,yu,yv] ,每像素占位2字节
3. YUV420 数据 [yu,y,yu,y,yv,y,yv,y] ,每像素平均占位1.5字节,因为占位少,视觉体验几乎没有变化,所以大多数视频编码使用这格式
YUV存储方式
1.打包模式Packed 按像素点存放,
如YUV444格式 [yuv1,yuv2,yuv3,yuv4,yuv5,yuv6,yuv7,yuv8]
2.平面模式Planar YUV分开存放
如YUV444格式
[y1,y2,y3,y4,y5,y6,y7,y8]
[u1,u2,u3,u4,u5,u6,u7,u8]
[v1,v2,v3,v4,v5,v6,v7,v8]
3.半平面模式Semi-Planar Y单独存放,UV一起存放
如YUV444格式
[y1,y2,y3,y4,y5,y6,y7,y8]
[uv1,uv2,uv3,uv4,uv5,uv6,uv7,uv8]
为方便查阅,通过表格整理一下:
“关键顺序”那一项没有Y时,Y都是单独存放
RGB格式转换成YUV格式公式
1. 归一化操作 我们知道RGB取值范围是[0~255], 归一化操作是(除以255)当前值/255.0 那么它的值范围[0~1]
2. RGB转YUV公式
Kr+Kg+Kb=1
Y=Kr*R+Kg*G+Kb*B
U=B−Y
V=R−Y
上面公式中的 K 是一个权重因子
Kr 代表 R红色通道的权重
Kg 代表 G绿色通道的权重
Kb 代表 B蓝色通道的权重
因为 K 权重因子是需要经过大量的实验才能得到,所以产生了以下标准
1. BT.601标准[1]——标清数字电视(SDTV)
Y=0.299R+0.587G+0.114B
2. BT.709标准[2]——高清数字电视(HDTV)
Y=0.2126R+0.7152G+0.0722B
3. BT.2020标准[3]——超高清数字电视(UHDTV)
Y=0.2627R+0.6780G+0.0593B
我们用 BT.601标准[1]——标清数字电视(SDTV) 为例推算出UV值
U =B−Y= B-(0.299R+0.587G+0.114B)= -0.299R - 0.587G + 0.886B
V = R−Y = R - (0.299R+0.587G+0.114B)= 0.701R-0.587G- 0.114B
这样UV分区取值范围是[?~?]多少,知道取值范围之后需要归一化操作
知道RGB取值范围是[0~1]
U的最大值是 [R=0,G=0,B=1]时0.886
U的最小值是 [R=1,G=1,B=0]时-0.886
U取值范围是[-0.886~0.886]归一化操作,
U=(-0.299R - 0.587G +0.886B)* (1/(0.886*2)) = 0.564*(-0.299R - 0.587G +0.886B) = -0.168R - 0.331G + 0.499B
同理推出 V值
V=V=(0.701R-0.587G- 0.114B)*(1/(0.701*2)) = 0.499R - 0.418G - 0.081B
最终公式
Y=0.299R+0.587G+0.114B
U = -0.168R - 0.331G + 0.499B
V==0.499R - 0.418G - 0.081B
用相同方式也能推算出不同标准下 RGB到YUV的转换公式
感谢大家的支持,如要问题欢迎提问指正。