关于音视频:视频中为什么需要这么多的颜色空间

27次阅读

共计 5336 个字符,预计需要花费 14 分钟才能阅读完成。

作者 | 17 哥

导读 :在视频解决中,咱们常常会用到不同的色调空间: 非线性 RGB,线性 RGB,YUV,XYZ……为什么须要这么多的色调空间呢?为什么在 FFMpeg 中会有 color\_space,color\_transfer,color\_primaries 等一系列的色彩属性呢?这些术语之间到底暗藏着什么机密 ?

全文 5840 字,预计浏览工夫 15 分钟。

01 视频采集

如上图所示,在相机零碎中,内部世界的光信息(光子,photons)通过透镜或其余光学器件聚焦之后达到相机的图像传感器(‍CCD‍ 或者 CMOS)。[1]

  • 图像传感器能够将一个入射光子(photon)转换为对应的一个电子(electron)。
  • 在曝光工夫内,图像传感器对转换的电子进行电荷积攒。
  • 而后,图像传感器会将积攒的电荷信号转换成对应的电压信号。
  • 最初,利用 ADC 把电信号转换成数字信号,而转换后的数字信号则为某个范畴内的整数值。

ADC 数字信号的取值范畴:

ADC 转换之后的数字信号的取值范畴受限于 ADC 设施。对于 8-bits 的 ADC 而言,数字信号的取值范畴为 [0, 2^8-1],因而,对于每一个像素而言,会用 [0, 255] 之间的整数来进行编码。

ADC 转换的数字信号的数值是一个线性编码的过程,这意味着如果将图像传感器上的光量减少 1 倍,则 ADC 转换之后对应的数值也会减少 1 倍。这是一个十分有用的个性:无论是减少物理世界的光量,还是减少 ADC 转换之后的数值,对图片而言,都会带来雷同的成果。线性编码意味着咱们所解决的数据和光发射的强度成正比关系。[2]

由数码相机中的 CMOS 传感器产生并写入原始文件(Raw File)的数据是线性的。与一般照片相比,线性数据通常看起来十分暗且对比度较低。[3]

在 iPhone 手机中,能够通过设置相机来拍摄 Apple ProRAW 格局的照片。

02 摸索视频伽马校对

实际上,钻研表明,人类视觉零碎是以对数函数的形式来感知光亮度。这意味着,人眼会进步暗部的敏感度,升高高光局部的敏感度。[4]

从数学角度看,感知光强度和测量光强度之间存在一个近似的平方关系,具体如下式所示。

因为人类视觉感知零碎不是以线性形式工作的,因而必须应用非线性曲线来对 ADC 生成的的线性数据进行变换,从而使得拍摄的图像色调与咱们的视觉零碎的工作形式相匹配。这个过程也就是咱们所说的 伽马校对。

因而,在从线性 RGB 空间转换到非线性 RGB 空间时,须要 γ 作为转换参数。相机中的 ISP 模块负责对图像传感器的线性 RGB 进行伽马校对进而产生对应的合乎人眼感知的非线性 RGB 数据。

RGB 的设施依赖性:

不同显示设施反对的色域空间不同,因而对于不同的显示设施而言,伽马校对之后的 RGB 数值也不同。从这个角度讲,RGB 是设施依赖型的色调空间。

03 视频压缩

依据如上的信息,咱们晓得:相机零碎通过 ISP 解决之后,最终会失去非线性的 RGB 信息。对于视频而言,如果以 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, VP9)对获取的数据进行视频编码,最终失去视频文件(此处疏忽了音频的采集编码以及合流的操作)。

04 视频转码

出于各种起因,例如:

  • 终端用户的带宽受限
  • 终端用户反对的视频编解码算法和相机压缩视频的编解码算法不统一
  • ……

个别不会间接把相机产出的视频文件分发给用户去生产。媒体服务商会对相机生成的视频文件进行转码,而后抉择适合的转码后的视频分发给终端生产用户。[5]

在视频转码阶段,如果咱们心愿对原视频进行色域的变换,例如从 BT. 601 转码为 BT. 709,则须要在不同色域的 RGB 数值之间进行转换。[6]

在不同的色域空间进行 RGB 数据的转换,这也就是咱们所说的 色调治理。色调治理会对图像进行色调治理以适配以后环境下的色彩成果,从而保障同一张图片在不同输出、输入上都呈现出最好的色彩。[7]

色调转换须要在某个线性空间下进行操作,并且操作过程须要放弃设施的独立性。因而,不同的 RGB 色域空间是不能间接进行转换的,须要一个设施无关、线性的色彩模型作为直达能力实现其转换。

而 XYZ(CIE 1931 XYZ color space) 具备设施无关、线性操作的个性。

在 FFMpeg 中,次要应用 colorspace 滤镜 来实现不同色域空间的转换。[6:1]依据 colorspace 的实现可知,在 FFMpeg 中,BT. 601->BT. 709 的转换过程如下所示:

在如上的变换中,波及到 3 个色彩空间的转换,别离是:

  1. YUV 和 RGB 之间的转换
  2. 线性 RGB 和非线性 RGB 之间的转换
  3. 线性 RGB 和 XYZ 之间的转换

在 FFMpeg 中,所有的这些转换参数都保留在 AVFrame 构造中[8]:

  • AVFrame->colorspace 中保留了 YUV/RGB 的转换矩阵
  • AVFrame->color\_trc 中保留了线性 RGB 和非线性 RGB 之间的转换函数(transformation characteristics)。
  • AVFrame->color\_primaries 中保留了 RGB/XYZ 的转换矩阵

如果用 ffprobe 命令解析视频文件,则:

  • color\_space 字段对应 YUV/RGB 的转换矩阵
  • color\_transfer 字段对应线性 RGB 和非线性 RGB 之间的转换函数
  • color\_primaries 字段对应 RGB/XYZ 的转换矩阵
$ ffprobe -select_streams v:0 -show_entries stream=color_space,color_transfer,color_primaries test.mp4

[STREAM]
color_space=bt2020nc
color_transfer=arib-std-b67
color_primaries=bt2020
[/STREAM]

在如上的例子中,arib-std-b67 也就是咱们所相熟的 HLG。

在 MediaInfo 中,

  • Matrix coefficients 字段对应 YUV/RGB 的转换矩阵
  • Transfer characteristic 字段对应线性 RGB 和非线性 RGB 之间的转换函数
  • Color primaries 字段对应 RGB/XYZ 的转换矩阵

除了如上的参数外,AVFrame->range 还用来存储视频中对应像素的每个重量的取值范畴。在 vf\_setparams.c 中也作了相干的定义阐明:

{"limited", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG},  0, 0, FLAGS, "range"},
{"tv",      NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG},  0, 0, FLAGS, "range"},
{"mpeg",    NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG},  0, 0, FLAGS, "range"},
{"full",    NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},  0, 0, FLAGS, "range"},
{"pc",      NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},  0, 0, FLAGS, "range"},
{"jpeg",    NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},  0, 0, FLAGS, "range"},

05 视频解码 & 播放

转码之后的视频,能够通过各种渠道散发到终端用户进行生产。对于大部分显示设施,例如 CRT 显示器、LCD、OLED,屏幕上的每个像素都是通过驱动三个十分凑近但依然离开的小型 RGB 光源而构建的。[9] 因而,显示屏(监视器,电视机,屏幕等等)仅应用 RGB 模型,并以不同的形式来组织,并显示最终的图像。[10]

如前所述,不同的显示设施采纳的 RGB 的色域并不一定雷同,因而,RGB 是一种设施依赖型的色彩模型。[11]在 Mac 电脑上,能够通过显示器配置来抉择显示器反对不同的 RGB 色域。

5.1 显示设施和相机的色域统一

如果编码视频和播放视频的显示器采纳的 RGB 色域是统一的,比方都是 sRGB,此时的播放过程绝对比较简单。视频解码之后,失去 YUV 数据,而后依据规范将 YUV 数据转换成非线性的 sRGB 数据,而后显示器依据 sRGB 数据显示图像即可。

5.2 显示设施和相机的色域不统一

当显示设施反对的色域从 sRGB 变为 Rec. 2020 时,如果间接显示 sRGB 色域下的数据,则会导致比较严重的色彩失真。

和转码阶段的色域转换相似,此时,也须要在不同的色域空间进行 RGB 数据的转换(色调治理)以保障雷同的视频在不同输出、输入、显示设施上都呈现出最好的色彩。

对于显示设施而言,sRGB->RGB(Rec. 2020)的转换过程如下所示:

因而,对于拍摄设施和显示设施的色域不同时,视频的播放减少了色彩治理的过程。

06 视频观看

尽管视频信息的采集和最终终端播放采纳的都是 RGB 的色彩模型,然而对人眼而言,RGB 其实并不直观,比方咱们很难马上反馈出天青色的 RGB 色值?

为了可能更直观的示意色彩,又引入了 HSL 色调模型。HSL 比 RGB 更加直观,比方:想从黄色适度到红色,只须要调整色相即可,饱和度和亮度放弃不变。因而,HSL 个别更适宜人的色调感知,而 RGB 更适宜显示畛域。

为了让作品能够呈现出冀望的成果,晋升用户的视觉体验,在摄影前期,应用 HSL 对作品进行调整是最不便的一种形式。利用 HSL 对作品进行调整,简略几步就能够让灰暗的「马路随拍」秒变「街头大片」。[12]

FFMpeg 的 signalstats 滤镜能够剖析获取视频的色调、饱和度、亮度信息。然而该滤镜获取的色调、饱和度和 HSL 中的计算 是不统一的。

signalstats 计算色调、饱和度的算法如下所示:

如果须要失去视频的规范 HSL 信息,能够应用作者开发的 vf\_hsl 滤镜。

07 结语

尽管色彩还是那个色彩,然而不同的色彩空间的适用范围并不相同:

  • RGB:面向采集和显示设施
  • YUV:面向存储
  • HSL:面向人类视觉感知
  • XYZ:RGB 之间的转换桥梁

从视频采集到视频生产的整个过程,波及到不同的设施和规范,而不同的设施和规范所反对的色域空间又不雷同。正是通过不同的色彩模型转换和不同的色域转换,才得以让咱们实现:在不同输出、输入、显示设施上都呈现出最好的色彩,才得以让咱们实现以近似雷同的观看体验来生产视频。

——END——

参考文献:

  1. CMOS Image Sensor 原理简述:https://zhuanlan.zhihu.com/p/…
  2. What does linear RGB mean:https://discuss.pixls.us/t/wh…
  3. How Digital Cameras Work:https://www.astropix.com/html…
  4. Linear vs. Logarithmic Dimming—A White Paper:https://www.pathwaylighting.c…\_materials\_1466797044\_Linear+vs+Logarithmic+Dimming+White+Paper.pdf
  5. What is Video Transcoding and Why Do You Do It:https://medium.com/videocoin/…
  6. Talking About Colorspaces and FFmpeg:https://medium.com/invideo-io…
  7. 【色彩迷信】RGB 和 XYZ 色彩空间的转换:https://blog.csdn.net/weixin\_43194305/article/details/107944264‍‍‍‍‍‍‍‍
  8. Colorspace support in FFmpeg:https://trac.ffmpeg.org/wiki/…
  9. RGB color model:https://en.wikipedia.org/wiki…\_color\_model
  10. 数字视频导论:https://wangwei1237.github.io…
  11. Computational Color Technology:https://www.spiedigitallibrar…
  12. 用 HSL 调色 = 简略、疾速、超出片:https://zhuanlan.zhihu.com/p/…

正文完
 0