在视频处理中,经常会用到不同色彩空间:非线性RGB,线性 RGB,YUV,XYZ……为什么需要这么多的色彩空间呢?
1、视频采集时的线性RGB颜色空间
由数码相机中的 CMOS 传感器产生并写入原始文件(Raw File)的数据(线性RGB图像)是线性的。与普通照片相比,线性数据通常看起来非常暗且对比度较低。
2、人类视觉系统需要非线性的图像颜色空间
研究表明,人类视觉系统是非线性感知光亮度,是以对数函数的方式来感知光亮度。这意味着,人眼会提高暗部的敏感度,降低高光部分的敏感度。
从数学角度看,感知光强度和测量光强度之间存在一个近似的平方关系,具体如下式所示。
3、如上,人类视觉感知系统不是以线性方式工作的,必须使用非线性曲线来对拍摄生成 的线性数据进行变换,从而使得拍摄的图像色调与我们的视觉系统的工作方式相匹配,这个过程就是 伽马校正。
这样,在从线性 RGB 空间转换到非线性 RGB 空间时,需要 γ \gamma γ 作为转换参数。相机中的 ISP 模块负责对图像传感器的线性 RGB 进行伽马校正进而产生对应的符合人眼感知的非线性 RGB 数据。
显示设备支持的色域空间不同,对于不同的显示设备而言,伽马校正之后的 RGB 数值也不同。从这个角度讲,RGB 是设备依赖型的色彩空间。
4、视频压缩所需的颜色空间
根据如上信息可知,相机系统经过 ISP 处理后,最终得到非线性的RGB (sRGB)信息。对于视频而言,如果以 RGB 存储每帧信息,需消耗大量存储空间。
人类视觉系统对颜色信息的敏感度弱于亮度信息,一般将相机捕获的 RGB 信息转换为 YUV 格式,然后对 YUV 格式进行色度信息采样(例如,YUV420)以便压缩图像空间。RGB->YUV,不同标准有不同要求,一般常用的标准有:
BT. 601(SD: Standard-Definition)
BT. 709(HD: High-Definition)
BT. 2020(UHD: Ultra-High-Definition)
标准中,不但会规定 RGB->YUV 的转换系数,同时还会规定从线性 RGB 到非线性 RGB 转换的 gamma 系数。
将 RGB颜色模型,转换成 YUV 模型后,接下来采用某种视频编解码标准(H265\H264)对获取的数据进行视频编码,最终得到视频文件(此处忽略音频采集编码及合流的操作)。
到目前为止,视频图像整个处理过程如下:
5、视频转码涉及的颜色空间
出于各种原因,例如:
终端用户的带宽受限
终端用户支持的视频编解码算法和相机压缩视频的编解码算法不一致
……
一般相机产出的视频文件不会直接分发给用户去消费,媒体服务商会对相机生成的视频文件进行转码,然后选择合适的转码后的视频分发给终端消费用户。
在视频转码阶段,如果我们希望对原视频进行色域的变换,例如从 BT. 601 转码为 BT. 709,则需要在不同色域的 RGB 数值之间进行转换。
在不同的色域空间进行 RGB 数据的转换,就是色彩管理。色彩管理对图像进行色彩管理以适配当前环境下的颜色效果,从而保证同一张图片在不同输入、输出上都呈现出最好的颜色。
色彩转换需在某个线性空间下进行操作,并且操作过程需要保持设备的独立性。因此,不同的 RGB 色域空间是不能直接进行转换的,==需要与设备无关、线性的颜色模型作为中转才能实现其转换,==而 XYZ(CIE 1931 XYZ color space) 模型符合上述要求。
在 FFmpeg 中,主要使用 colorspace 滤镜 来完成不同色域空间的转换。 由colorspace 实现可知,在 FFmpeg 中,BT. 601->BT. 709 的转换过程如下所示:
如上变换中,涉及到 3 个颜色空间转换:
绿色数字1:YUV 和 RGB 之间的转换
绿色数字2:线性 RGB 和非线性 RGB 之间的转换
绿色数字3: 线性 RGB 和 XYZ 之间的转换
6、视频解码&播放涉及到的颜色空间
转码之后的视频,通过各种渠道分发到终端用户进行消费。大部分显示设备,例如CRT显示器、LCD、OLED,屏幕上的每个像素是通过驱动三个非常靠近但仍然分开的小型 RGB 光源构建的。 因此,显示屏(监视器,电视机,屏幕等等)仅使用 RGB 模型,以不同的方式组织,显示最终的图像。如前所述,RGB 是一种设备依赖型颜色模型,不同显示设备采用 RGB 色域不一定相同。在 Mac 电脑上,可以通过显示器配置来选择显示器支持不同的 RGB 色域。
下面分几种情况介绍显示中涉及的颜色空间
(1)显示设备和相机的色域一致
编码视频和播放视频的显示器的 RGB 色域是一致的,比如都是 sRGB。视频解码获取 YUV 数据,根据标准YUV 数据->成非线性的 sRGB 数据,显示器根据 sRGB 数据显示即可。
(2)显示设备和相机的色域不一致
若显示设备支持色域从 sRGB(Standard-Definition下的色域) 变为 Rec. 2020 ,直接显示 sRGB 色域下的数据,会导致比较严重的颜色失真。
和转码阶段色域转换类似,在不同的色域空间进行 RGB 数据转换(色彩管理)以保证相同视频在不同输入、输出、显示设备上都呈现出最好的颜色。
对于显示设备而言,sRGB->RGB(Rec. 2020)的转换过程如下所示:
这种情况下,拍摄设备和显示设备色域不同,视频从采集到播放增加了颜色管理,如图示:
7、视频观看涉及的颜色空间
虽然视频采集和最终终端播放采用都是 RGB 颜色模型,但对人眼而言,RGB 其实并不直观,比如我们很难马上反应出天青色的 RGB 色值?
为能更直观表示颜色,又引入了 HSL 色彩模型。HSL 比 RGB 更加直观,比如:想从黄色过度到红色,只需要调整色相即可,饱和度和亮度保持不变。因此,HSL 一般更适合人的色彩感知,而 RGB 更适合显示领域。
在摄影后期,HSL 调整作品是最方便的一种方式。简单几步就可以让灰暗的马路随拍秒变街头大片,如下:
原始图像
HLS模型处理后的图像
总结
虽然颜色还是那个颜色,但是不同的颜色空间的适用范围并不相同:
RGB:面向采集和显示设备
YUV:面向存储
HSL:面向人类视觉感知
XYZ:RGB之间的转换桥梁
从视频采集到视频消费的过程,涉及到不同的设备和标准,而不同的设备和标准所支持的色域空间又不相同。正是通过不同的颜色模型转换和不同的色域转换,才得以让我们实现:在不同输入、输出、显示设备上都呈现出最好的颜色,才得以让我们实现以近似相同的观看体验来消费视频。
参考 https://wangwei1237.github.io/2022/08/14/Why-so-much-color-space-in-video/