RGB与YUV相互转换

从前文已经知道,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与YUV相互转换_第1张图片

RGB与YUV相互转换_第2张图片

RGB与YUV相互转换_第3张图片

RGB与YUV相互转换_第4张图片

参考文章:

1,RGB转YUV及YUV格式


由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习]

你可能感兴趣的:(FFmpeg源码分析,docker,linux,容器)