YUV是视频处理中的颜色编码方法,在YUV演进的历史中标准不断更新,多个版本之间有着紧密的关系,同时也让人眼花缭乱。这篇博客从YUV历史演变的角度介绍YUV图像标准。
YUV与RGB的关系
目前的显示设备大都采用RGB色彩空间,RGB是从颜色的原理来设计制定的,采用混色法把RGB进行不同权重的混叠就可以得到不同的颜色。
YUV从颜色属性上来说时亮色分离的,亮度信号Y和色度信号U、V是分离开来的。最早我们的电视机是黑白电视机,YUV的设计正是彩色电视机为了兼容黑白电视机所做的设计,黑白电视机只接收Y信号,彩色电视机额外接收UV信号。
亮色分离还有一个好处就是可以降低信号传输的带宽。人眼对亮度敏感而对颜色不敏感,减少颜色数据的数量,人眼感知不明显。所以我们会通过降低UV通道图像的分辨率来达到降低数据传输带宽目的。
YCbCr
传统意义上的YUV是模拟信号(所以我们可以看到YUV存在负数值),我们在视频通信系统中的YUV实际上是YCbCr,Cb和Cr是差值。YCbCr和YUV存在一定的换算关系:
Y = Kry· R + Kgy· G + Kby· B(R,G,B代表RGB色彩空间的红色,绿色,蓝色)
Cb= B – Y (Cb是差值)
Cr= R – Y(Cr是差值)
公式中的系数在 BT.601 BT.709 BT.2020 中的权重是不同的。信号相互转换的内容放到后面详细介绍
YPbPr
YPbPr仅仅用于模拟信号,由于模拟分量接口没有统一的标准,所以YPbPr,仅仅是美国标准
ITU-R 行业标准
ITU-R Recommendation BT.601
1982年CCIR(国际无线电咨询委员会)制定了彩色视频数字化标准,标准对625行电视和525行电视进行兼容,规定了彩色视频转换成数字图像时使用的采样频率,RGB和YCbCr两个彩色空间之间的转换关系等。
ITU-R Recommendation BT.709
1990年 HDTV标准开始制定,1080p/50 1080p/60 两种逐行扫描场帧制定标准,标准保留了隔行扫描,这一标准是妥协的产物。
ITU-R Recommendation BT.2020
2012年,ITU-R颁布了面向新一代高清UHD视频制作和显示系统的BT.2020标准,重新定义了超高清视频和显示的各项参数指标,促进4K和8K视频家用显示设备的规范化。考虑世界各个地区视频显示系统发展的差异,UHD超高清视频显示系统包括4k和8k两个阶段,BT.2020 规定的4k分辨率为3840*2160, 8k 分辨率为 7680*4320.
BT.2020标准不仅提升了分辨率,也提升了色彩的标准,在BT.2020标准下,显示设备能够显示更多的颜色。
BT.2020 还提升了色彩位宽,BT.709信号为8bit,在BT.2020 标准下,信号位宽在4k下提升到了10bit,在8k下提升到了12bit,能够显示更为丰富的颜色。
刷新率上支持120p, 60p, 59.94p, 50p, 30p, 29.97p, 25p, 24p, 23.976p, 可以看到 BT.2020 中取消了个号扫描,所有超高清标准下的影像都是基于逐行扫描的。
色彩空间转换
YUV-RGB 相互转换
RGB转换为YUV信号时需要注意,YUV是模拟信号,Y的电压范围是0~1伏,UV的电压bias为0伏。
YUV转回RGB时,YUV也同样有信号电压的约束
YCbCr-RGB 相互转换
BT.601标准
BT.709标准
BT.709标准-全范围
我们不难发现,不论是BT.709 还是 BT.601, CbCr的值域都是16-240, Y是16-235,而8位数字信号的范围是0-255,所以有一个全精度的转换公式
YUV的采样格式
YUV的采样格式有411,420,422,444
YUV411: 水平Y取四个点,UV 在奇数行取一个点,偶数行取一个点
YUV420:水平Y取四个点,UV在奇数行取两个点,偶数行取零个点
YUV422:水平Y取四个点,UV在奇数行取两个点,偶数行取两个点
YUV444:水平Y取四个点,UV在奇数行取四个点,偶数行取四个点
YUV的存储格式
YUV存储,按照是否分平面存放分为:
- 平面P:YUV分别存放与不同的平面
- 混合平面SP:Y单独存放一个平面,UV交织存放
- 交织S:YUV交替存放
分平面存放数据的格式由分为:
- I420/YV12,数据总长度为 1.5 WH
- I422/YV16,数据总长度为 2WH
- I444/YV24,数据总长度为 3WH
混合交织存放UV的格式又分为
- NV12/NV21
- NV16/NV61
- NV24/NV42
交织存放的格式又分为:
- YUV444Pack
- VYUY
- YUVY
- UYVY
数据可以选择紧密存放(pack),也可以选择字节对齐存放,比如10bit 可以单独占用两个字节。关于数据格式的详细介绍参照文末的参考链接。