YUV简介

举报
AnRFDev 发表于 2021/12/30 20:07:26 2021/12/30
【摘要】 介绍YUV的相关概念。本文链接 https://an.rustfisher.com/media/color/yuv-intro/ 颜色空间 color space在电脑图形中我们常会遇到RGB颜色。RGB中的红绿蓝直接分别对应了可见光的部分。RGB值能建立一个精确的数字坐标系统,称作颜色空间(color space)。红色部分定义了坐标系中的一个轴。其次是绿色和蓝色。如下图所示。所有有效的R...

介绍YUV的相关概念。
本文链接 https://an.rustfisher.com/media/color/yuv-intro/

颜色空间 color space

在电脑图形中我们常会遇到RGB颜色。RGB中的红绿蓝直接分别对应了可见光的部分。
RGB值能建立一个精确的数字坐标系统,称作颜色空间(color space)。红色部分定义了坐标系中的一个轴。
其次是绿色和蓝色。如下图所示。所有有效的RGB值都在这个颜色空间里。

例如<text style="color: rgb(255,0,255)">洋红色(pure magenta)</text>是 100% blue,100% red, 和 0% green.

yuv-color-cor.png

RGB是代表颜色的一种方式。其它坐标系也可以代表颜色。

YUV是一种颜色编码方法。数字视频常用YUV格式来压缩。

YUV定义

YUV是将亮度信息和颜色信息分别编码的一系列颜色空间的统称。和RGB相似,YUV使用3个值来表示颜色。
这3个值称为Y’,U,和V。(事实上,YUV这个称呼在电脑视频中总是指代Y'CbCr。然而在本文中YUV经常用来指代和Y'CbCr相同原理的颜色空间)

YUV类似RGB,都能代表颜色表示颜色

Y'部分,也称作luma,代表颜色中的亮度值。这个记号(')是用来与称为Y的luminance(亮度)作区别的。

luminance可从线性RGB值中导出,luma从非线性(gamma-corrected)RGB值中导出。
luminance更接近真实亮度,但luma在技术上更常用。
点记号(')通常被忽略,但YUV颜色空间总是使用luma。后文会混用YY'

标准定义电视中,luma计算公式为:

Y' = 0.299R + 0.587G + 0.114B

这个公式揭示了人眼对于特定波长的光更为敏感。蓝色是最暗淡的,绿色是最明亮的,红色处于两者之间。
这个公式也影响了早期电视使用的荧光粉。

现代电视技术使用了更新的公式,用于高清电视

Y' = 0.2125R + 0.7154G + 0.0721B

公式相关定义可查询ITU-R BT.601

U和V部分,称为色度值或颜色区分值。由以下公式计算:

U = B - Y'
V = R - Y'

YUV能够完整地还原回RBG值。传输来的YUV,能转换为相应的颜色值。

采样方式

yuv-sampling-system-ratio.png

采样通常用3部分的比例表示J:a:b(例如4:2:2)。如果有alpha通道,也用4个数的比例(例如4:2:2:4)。

概念上来说,我们考虑的是J个像素宽,2个像素高的区域。

  • J: 水平采样的参考,也可以说是宽度,通常是4
  • a: 第一行J个像素的色度个数(Cr, Cb)
  • b: 第一行和第二行有差别的色度个数(Cr, Cb)。注意b的值通常为0或者等于a。

主流的采样方式有三种:YUV4:4:4,YUV4:2:2,YUV4:2:0

YUV4:4:4

yuv444.png

第一行有4组UV。第二行有另外的4组UV。这也叫做“全采样”。

YUV4:2:2

yuv422.png

第一行有2组UV。第二行有另外2组UV。

看起来就像是2个像素点共用1组UV(1个U和1个V)

YUV4:2:0

yuv420.png

我们看虚线框内。第一行有2组UV。第二行没有自己的UV,用的UV和第一行相同。

看起来就像是4个像素共用1组UV。

YUV的优点

由于历史原因,模拟电视部分使用了YUV格式。模拟彩色电视信号能够兼容以前的黑白电视。
彩色电视信号携带着色度值(U和V)与灰度值。黑白电视忽略色度值,显示出灰度图片。
彩色电视可以提取出色度信息并将信号还原回RGB。

在今天YUV有着另一个优点。相比于亮度的变换,人眼对于色彩的变换更迟钝。那么一张图片中,可以少存放一些色度信息。
例如,最开始1个像素有Y’UV这3个值。可以将同水平线(horizontal resolution)上的色度值的数量降为亮度值数量的一半。

换言之,一行像素中,每2个亮度值共用1个U和V值。
假设每个值是8位,则每2个像素需要4个字节来表示(2个Y’,1个U和1个V)。平均下来每个像素用16位来表示。
相当于损失了30%的24位RGB编码。

上面的小例子:最开始2个像素共需要6个字节(2套Y’UV)。现在2个像素共需要4个字节(2个Y’,1个U和1个V)。

YUV并没有压缩RGB信息。除非色度值被降低采样率。一个YUV像素和一个RGB像素有着相同的大小。
从RGB换算成YUV并没有损失信息。若没有降采样率,一个YUV像素可以无损地转换回RGB像素。
降低采样率会损失一些颜色信息但能让YUV图像更小。如果处理得当,这种损失是可以接受的。

计算机视频中的YUV

上面的YUV并不是数字视频中最准确的转换方式。数字视频通常使用一种称为Y'CbCr的YUV格式。
通常,Y'CbCr对于YUV的范围是:

Y'     16235
Cb/Cr  16240, with 128 representing zero

上面这些范围以8位Y'CbCr为前提。
接下来是Y'CbCr的计算过程,使用BT.601的luma定义。

  1. RGB值范围是[0,1]。换言之纯黑是0,纯白是1.这些是非线性的RGB值。
  2. 计算luma。BT.601中,Y' = 0.299R + 0.587G + 0.114B,如前文所述。
  3. 计算色度值(B - Y’) 和 (R - Y’)。这些值范围, (B - Y’)范围是 +/- 0.886;(R - Y’)范围是+/- 0.701
  4. 缩放色度值
Pb = (0.5 / (1 - 0.114)) × (B - Y')
Pr = (0.5 / (1 - 0.299)) × (R - Y')

这里的缩放因子的设计目的是为了计算得到同样的范围,+/- 0.5。
它们定义了一个称为Y'PbPr的YUV颜色空间。这种颜色空间用于模拟信号视频。
5. 通过Y'PbPr计算出Y'CbCr

Y' = 16 + 219 × Y'
Cb = 128 + 224 × Pb
Cr = 128 + 224 × Pr

计算得到的值的取值范围就是前面所列的Y'CbCr范围。当然也可以直接将RGB值转换为Y'CbCr

参考

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。