YUV格式简介
在计算机图形学中,使用最常见的就是RGB颜色。
RGB 颜色使用三个值进行编码:红色、绿色和蓝色。 这些值直接对应于可见光谱的部分。 这三个 RGB 值构成数学坐标系,称为 颜色空间。 红色分量定义此坐标系的一个轴,蓝色定义第二个轴,绿色定义第三个轴。 任何有效的 RGB 颜色都位于此颜色空间中的某个位置。 例如,纯洋红为 100% 蓝色、100% 红色和 0% 绿色。
YUV由Y分量和两个UV分量组成。
- Y:称为颜色的亮度值(Luminance or Luma)。
- U:称为蓝色投影Cb。
- V:称为红色投影Cr.
所以UV表示了图像的色度(Chrominance or Chroma)信息,Y称为图像的亮度或者灰度信息。
YUV计算公式
Y变量采用红色、绿色和蓝色分量的加权平均值来计算。其计算公式如下:
BT.601
Y' = 0.299R + 0.587G + 0.114B
上面这公式也反映了不同的颜色对于人眼亮度的敏感程度。蓝色浅色显示为最暗,绿色显示最亮,红色位于两者之间。不过随着数字计算机工艺的发展,经常使用修正过的公式来计算Y分量。
BT.709
Y' = 0.2125R + 0.7154G + 0.0721B
UV分量也称为也称为色度值或颜色差异值,其通过从原始 RGB 颜色的红色和蓝色分量中减去 Y 值来得到。
U = B - Y'
V = R - Y'
可以看到,这里的UV包含的是是蓝色和红色的信息,而绿色的信息则由Y分量分担。
当然这样的计算方法对RGB的信息会有损失,但对于我们眼睛来说,其包含了足够的数据信息,也是足够了。
比如RGB(100,255,110)和RGB(100,252,110),对于人眼来说,可能根本就区分不出区别,这也就是YUV的优势。
YUV的取值范围
使用BT.601的计算方法:
Y' = 0.299R + 0.587G + 0.114B
那么对于 (B - Y’) ,这些值的范围为 +/- 0.886,对于 (R - Y’) ,这些值为 +/- 0.701
为了使其值在相同的取值范围,如尽量在(0~255)之内,需进行缩放。采用的公式如下:
Pb = (0.5 / (1 - 0.114) ) × (B - Y')
Pr = (0.5 / (1 - 0.299) ) × (R - Y')
所以最终的计算公式如下:
Y' = 16 + 219 × Y'
Cb = 128 + 224 × Pb
Cr = 128 + 224 × Pr
所以最终YUV的取值范围就成了:
取值范围 | |
---|---|
Y | 16–235 |
U/V | 16–240, 128 表示零 |
下表展示了BT.601下各种颜色在RGB和YUV之间的取值
Color | R | G | B | Y’ | Cb | Cr |
---|---|---|---|---|---|---|
黑色 | 0 | 0 | 0 | 16 | 128 | 128 |
红色 | 255 | 0 | 0 | 81 | 90 | 240 |
绿色 | 0 | 255 | 0 | 145 | 54 | 34 |
蓝色 | 0 | 0 | 255 | 41 | 240 | 110 |
青色 | 0 | 255 | 255 | 170 | 166 | 16 |
洋红色 | 255 | 0 | 255 | 106 | 202 | 222 |
黄色 | 255 | 255 | 0 | 210 | 16 | 146 |
白色 | 255 | 255 | 255 | 235 | 128 | 128 |
YUV参考文档:
https://learn.microsoft.com/en-us/windows/win32/medfound/about-yuv-video