从前文已经知道,R,G,B,3个分量都跟 亮度密切相关,也就是 3个分量里面都有大量的亮度信息。

RGB 转 YUV 的过程实际上就是 把 RGB 3分量里面的亮度信息 提取出来,放到 Y 分量。再把 RGB 3分量里面的 色调 ,色饱和度 信息提取出来放到 U跟 V分量。

所以这是一个信息提取过程,需要经过大量的实验。

提取 Y 亮度信息的公式如下:

$$
Y = Kr * R + Kg * G + Kb * B
$$

上面公式中的 K 是一个权重因子,Kr 代表 红色通道的权重,Kg 代表 绿色通道的权重,Kb 代表 绿色通道的权重,而且 Kr + Kg + Kb = 1

Cb 的定义是 B - Y 的差值,如下:

$$
Cb = B - Y
$$

Cr 的定义是 R - Y 的差值,如下:

$$
Cr = R - Y
$$

Cg 的定义是 G - Y 的差值,如下:

$$
Cg = G - Y
$$

上面的 Cb 就是 U 分量,V 是 Cr 分量。我们实际编码存储,或者传输的时候,是不需要用到 Cg 的。从上面的公式 可以看出,只需要知道 Y 跟 Cb 就能求 B 的值,知道 Y 跟 Cr 就能求 R 的值。知道 Y ,R 跟 B 就能根据第一条公式求到 G 的值。所以 Cg 没必要存储。Cr + Cb + Cg 其实是一个常量。


因为 K 权重因子是需要经过大量的实验才能得到,经过实验研究后发现,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
$$

因为某些原因,亮度这个信息,不能完完全全 从 RGB 里面提取出来,总会残留一些亮度信息在 RGB 里面没提取到。所以 K 权重因子 根据不同标准也是不同的。

BT.2020标准 生成的 YUV 数据在 编码系统里面的压缩率 是比 BT.709 小的,虽然现在还没开始进行编码压缩,但是确确实实,K权重因子会影响压缩效果。

本文主要讲解的是 BT.601 标准里面的计算公式。


补充 :讨论记录

rgb图像转hsv图像 python rgba转yuv_docker

rgb图像转hsv图像 python rgba转yuv_权重_02

rgb图像转hsv图像 python rgba转yuv_docker_03

rgb图像转hsv图像 python rgba转yuv_docker_04