1. 前言
查看视频文件中对颜色的描述,使用ffprobe指令:ffprobe -i 视频文件地址 -show_streams,有打印如下颜色相关的信息:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
以上参数表示:视频的色彩模型使用YUV表示,采样格式是420p;色彩范围使用tv模式,又叫limited range;YUV到RGB的转换矩阵采用BT.601(smpte170m);传递函数:BT.601(smpte170m);色彩原色:BT.601(bt470bg)。
在剪辑场景下,往往需要处理多个视频文件,而视频文件的颜色信息又可能各不相同,如何正确使用这些参数,让播放时视频正确的显示在屏幕上,导出的视频不会产生偏色?带着这些问题,我们先来了解一些色彩空间的概念:色域、传递函数、转换矩阵、YUV/YCbCr模型。
2. 色彩空间
2.1. 马蹄图:
人们通过实验发现,仅仅通过三种基本颜色就可以组合成其他颜色,这就是三原色理论,与人眼感知颜色的三种视锥细胞L、M、S相对应。
颜色匹配实验:把屏幕分成两半,左边投影纯色光。右边使用三基色(RGB)混合,观察者可以改变基本光的强度,直到分辨不出两块屏幕颜色有区别,并记录三基色的强度。
1931年国际照明委员会CIE使用700nm的红、546.1nm的绿、435.8nm的蓝作为三原色,通过颜色匹配实验建立了CIE 1931 RGB色度系统,并从该系统中导出只有rg两轴的平面坐标图CIE 1931 RGB色度图,如图1,在消灭 RGB色度图中的负值和亮度后,得到CIE 1931 XY色度图,又称马蹄图,如图2。
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
2.2. 色域:color_primaries
色域由三原色和白点构成。
取R(1,0,0),G(0,1,0),B(0,0,1) 映射到CIE 1931 XY空间,构造一个三角形,这个三角形区域就是色域,三个顶点表示该色域下的红绿蓝三原色,不同色域的三原色在XY空间中的坐标不同,比如BT.709(sRGB)三原色坐标为:R(0.640, 0.330),G(0.300, 0.600),B(0.150, 0.060);BT.2020三原色坐标为:R(0.708, 0.292),G(0.170, 0.797),B(0.131, 0.046)。三角形的体积越大能表现的颜色越多,BT709(sRGB)占了所有颜色的35.9%、BT2020占了所有颜色的75.8%。
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
色域三角形中心的白点表示该色域下的基准白色,移动白点会导致整个色域相对偏蓝或者偏红,BT601/BT709/BT2020的基准白色都是D65,坐标(x=0.3127, y=0.3290)。
色域转换。二维色域图是三角形,三维色域图是一个立方体,图4:是RGB空间在CIE XYZ空间中的三维映射,向量SR、SG、SB构成的立方体是色域的RGB颜色空间,色域不同就是位于XYZ坐标系下RGB立方体不同,那么色域转换需要先把rgb值转到XYZ坐标系得到xyz值,再从xyz值转到目标色域RGB坐标系下得到新的rgb值。
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
色域转换流程:BT2020色域 => XYZ坐标 => BT709如下:
BT2020RGB转XYZ矩阵:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
XYZ转BT709RGB矩阵:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
相乘得到BT2020转BT709矩阵:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
2.3. 传递函数:color_transfer
传递函数又称gamma矫正,传递函数用来把线性的自然光信号转换成非线性的电信号存储,这个过程是gamma编码,叫做光电转换(OETF),显示屏把非线性的电信号转换成屏幕光显示,这个过程是gamma解码,叫做电光转换(EOTF),视频文件中的color_transfer值显示为BT.601(smpte170m)、BT.709等,BT601的gamma值是2.4,BT709的gamma值是2.2,下图5是传递函数变换曲线,经过OETF和EOTF叠加之后,信号重新变成一条直线。
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
为什么需要gamma矫正,主要有以下3个原因:
1、人眼对亮度的感知是非线性的,对暗部细节更加敏感,而对亮部细节相对不敏感。这意味着直接使用线性亮度值来表示图像会导致图像在视觉上显得不自然。gamma 矫正通过非线性变换来调整亮度,使其更符合人眼的感知特性。图6中自然界亮度变化是线性的,而人眼视觉上是对数的。
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
2、显示器特性
显示设备(如 CRT 显示器、LCD 屏幕、投影仪等)在响应输入电压和输出亮度之间也存在非线性关系。CRT 显示器的亮度输出与输入电压的关系大致遵循一个幂函数,输出亮度L与输入信号V之间的关系可以表示为 L=,其中是 gamma 值,通常约为 2.2 到 2.5。为了在这些显示设备上正确显示图像,必须进行 gamma 矫正。
3、保留更多的暗部细节
对图像进行 gamma 矫正可以提高编码和存储效率。在没有 gamma 矫正的情况下,高亮度值会占据大量的编码空间,而低亮度值的细节可能会丢失。通过 gamma 矫正,将亮度值进行非线性变换,可以更好地分配编码空间,保存更多的暗部细节信息。
2.4. YUV转换矩阵:color_space
color_space用来表示YUV与RGB之间转换时,所使用的转换矩阵系数,是一个3*3的矩阵。
YUV色彩模型
在讲转换矩阵之前,先来了解一下YUV的定义,其中Y表示亮度信息,UV表示色度信息。YUV的优势:1、把亮度和色度分离,比较适合图像处理领域。2、与RGB相比,YUV所使用的存储空间更小。
YCbCr模型源于YUV模型,YUV应用于模拟电视系统,如 PAL 和 NTSC 标准,用于确保彩色电视信号与黑白电视信号的兼容性。YCbCr 色彩模型主要用于数字视频标准,如 JPEG 图像压缩、MPEG 视频压缩以及数字电视标准(如 ITU-R BT.601 和 BT.709),人们常说的YUV大多是指YCbCr,本文所说的YUV均表示YCbCr,YUV有许多采样格式, 如4∶4∶4 , 4∶2∶2 , 4∶1∶1 和4∶2∶0。比较常用的是4∶2∶0格式,4个Y共用一对UV,YUV420又有四种格式i420、YV12、NV12、NV21,这几种格式的区别主要在于UV存储顺序不同,下图7所示:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
转换矩阵
视频文件中的color_space字段表示在YUV转RGB时需要使用哪个转换矩阵,比如BT601/BT709/BT2020等,以BT709为例:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
BT709YUV与RGB之间相互转换的矩阵
YUV色彩范围
YUV有两种色彩范围:tv range和pc range,tv range又叫limited range,pc range又叫full range,ffmpeg中用AVCOL_RANGE_MPEG和AVCOL_RANGE_JPEG分别表示tv range和pc range。下表展示了tv range与pc range的数值范围对比:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
为什么需要tv range
1、历史原因:有限范围的YUV是为了兼容模拟电视信号设计的。在模拟信号中,值不能达到完全的黑色0或完全的白色255,因此采用了有限的范围来确保信号的稳定性和兼容性。
2、防止裁剪和超量化:使用有限范围可以防止在信号传输和处理过程中因裁剪或超量化导致的图像损失。例如,Y分量的值在0-15和236-255之间被保留用于同步信号和错误检测。在低段不使用的16个数字,学名叫footroom,高的那段叫headroom,这部分不能用的数字表示sync信号。
3、色彩空间转换:在从RGB转换到YUV色彩空间时,有限范围可以防止极端的颜色值在转换过程中导致失真或剪切。
tv range YUV->RGB转换矩阵
需要把原点从(16, 128, 128)移动回(0, 0, 0),然后再把YUV值缩放到pc range的范围,公式如下:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
以BT709YUV为例。
BT709归一化YUV转换到RGB:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
BT709 8位YUV转换到RGB:
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
3. 剪辑中的处理
以BT709作为目标为例:输入视频统一转到BT709色域。
![视频剪辑中的色彩空间](https://www.nxrte.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
首先根据color_space和color_range信息得到yuv转rgb的矩阵,得到rgb = YUV2RGB_BT470BG_TV_MAT * yuv。- 根据color_transfer得到传递函数,把非线性rgb转为线性,gamma解码:rgb = BT470BG_EOTF_gammaMethod(rgb)。
- 色域转换,先从BT601色域坐标系转到XYZ坐标再转到BT709坐标系,rgb = BT601_TO_BT709_MAT * rgb。
- 把线性rgb数据送给渲染引擎,添加特效信息,比如高斯模糊等。
- 屏幕的输入rgb要求非线性,在上屏显示之前需要gamma编码:rgb = BT709_OETF_gammaMethod(rgb)。
- 视频导出:把上屏前的非线性rgb与BT709 color_space/ tv color_range的逆矩阵相乘,得到yuv数据,同时配置视频流的色彩范围为:tv range,color_space:709,传递函数:BT.709,色彩原色:BT.709。
4. 总结
在视频剪辑中,颜色处理是确保视频质量和视觉效果的关键步骤。理解色域和色彩空间的概念,正确进行颜色校正和处理,可以显著提升视频的专业性和吸引力,对后续HDR的支持,HDR与SDR的相互转换也非常重要。
-End-
作者丨一禅
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。