导读:在视频处理中,我们经常会用到不同的色彩空间:非线性RGB,线性RGB,YUV,XYZ为什么需要这么多的色彩空间呢? 为什么在FFMpeg中会有colorspace,colortransfer,colorprimaries等一系列的颜色属性呢? 这些术语之间究竟隐藏着什么秘密? 全文5840字,预计阅读时间15分钟。1视频采集 如上图所示,在相机系统中,外部世界的光信息(光子,photons)通过透镜或其他光学器件聚焦之后达到相机的图像传感器(CCD或者CMOS)。图像传感器可以将一个入射光子(photon)转换为对应的一个电子(electron)。在曝光时间内,图像传感器对转换的电子进行电荷积累。然后,图像传感器会将积累的电荷信号转换成对应的电压信号。最后,利用ADC把电信号转换成数字信号,而转换后的数字信号则为某个范围内的整数值。ADC数字信号的取值范围: ADC转换之后的数字信号的取值范围受限于ADC设备。对于8bits的ADC而言,数字信号的取值范围为〔0,281〕,因此,对于每一个像素而言,会用〔0,255〕之间的整数来进行编码。 ADC转换的数字信号的数值是一个线性编码的过程,这意味着如果将图像传感器上的光量增加1倍,则ADC转换之后对应的数值也会增加1倍。这是一个非常有用的特性:无论是增加物理世界的光量,还是增加ADC转换之后的数值,对图片而言,都会带来相同的效果。线性编码意味着我们所处理的数据和光发射的强度成正比关系。 由数码相机中的CMOS传感器产生并写入原始文件(RawFile)的数据是线性的。与普通照片相比,线性数据通常看起来非常暗且对比度较低。 在iPhone手机中,可以通过设置相机来拍摄AppleProRAW格式的照片。2探索视频伽马校正 实际上,研究表明,人类视觉系统是以对数函数的方式来感知光亮度。这意味着,人眼会提高暗部的敏感度,降低高光部分的敏感度。 从数学角度看,感知光强度和测量光强度之间存在一个近似的平方关系,具体如下式所示。 由于人类视觉感知系统不是以线性方式工作的,因此必须使用非线性曲线来对ADC生成的的线性数据进行变换,从而使得拍摄的图像色调与我们的视觉系统的工作方式相匹配。这个过程也就是我们所说的伽马校正。 因此,在从线性RGB空间转换到非线性RGB空间时,需要作为转换参数。相机中的ISP模块负责对图像传感器的线性RGB进行伽马校正进而产生对应的符合人眼感知的非线性RGB数据。 RGB的设备依赖性: 不同显示设备支持的色域空间不同,因此对于不同的显示设备而言,伽马校正之后的RGB数值也不同。从这个角度讲,RGB是设备依赖型的色彩空间。 C音视频学习资料免费获取方法:关注音视频开发T哥,点击链接即可免费获取2023年最新C音视频开发进阶独家免费学习大礼包!3视频压缩 根据如上的信息,我们知道:相机系统经过ISP处理之后,最终会得到非线性的RGB信息。对于视频而言,如果以RGB存储每帧的信息,则需要消耗大量的存储空间。 人类视觉系统对颜色信息的敏感度要弱于亮度信息,利用这一特点,通常相机会将捕获的RGB信息转换为YUV格式,然后对YUV格式进行色度信息采样(例如,YUV420)以便压缩图像空间。 RGBYUV,不同标准有不同要求,一般常用的标准有:BT。601(SD:StandardDefinition)BT。709(HD:HighDefinition)BT。2020(UHD:UltraHighDefinition)注意: 标准中,不但会规定RGBYUV的转换系数,同时还会规定从线性RGB到非线性RGB转换的gamma系数。 将RGB颜色模型,转换成YUV模型后,接下来会采用某种视频编解码算法(例如,H265,VP9)对获取的数据进行视频编码,最终得到视频文件(此处忽略了音频的采集编码以及合流的操作)。 4视频转码 出于各种原因,例如:终端用户的带宽受限终端用户支持的视频编解码算法和相机压缩视频的编解码算法不一致 一般不会直接把相机产出的视频文件分发给用户去消费。媒体服务商会对相机生成的视频文件进行转码,然后选择合适的转码后的视频分发给终端消费用户。 在视频转码阶段,如果我们希望对原视频进行色域的变换,例如从BT。601转码为BT。709,则需要在不同色域的RGB数值之间进行转换。 在不同的色域空间进行RGB数据的转换,这也就是我们所说的色彩管理。色彩管理会对图像进行色彩管理以适配当前环境下的颜色效果,从而保证同一张图片在不同输入、输出上都呈现出最好的颜色。 色彩转换需要在某个线性空间下进行操作,并且操作过程需要保持设备的独立性。因此,不同的RGB色域空间是不能直接进行转换的,需要一个设备无关、线性的颜色模型作为中转才能实现其转换。 而XYZ(CIE1931XYZcolorspace)具备设备无关、线性操作的特性。 在FFMpeg中,主要使用colorspace滤镜来完成不同色域空间的转换。〔6:1〕根据colorspace的实现可知,在FFMpeg中,BT。601BT。709的转换过程如下所示: 在如上的变换中,涉及到3个颜色空间的转换,分别是:YUV和RGB之间的转换线性RGB和非线性RGB之间的转换线性RGB和XYZ之间的转换 在FFMpeg中,所有的这些转换参数都保存在AVFrame结构中〔8〕:AVFramecolorspace中保存了YUVRGB的转换矩阵AVFramecolortrc中保存了线性RGB和非线性RGB之间的转换函数(transformationcharacteristics)。AVFramecolorprimaries中保存了RGBXYZ的转换矩阵 如果用ffprobe命令解析视频文件,则:colorspace字段对应YUVRGB的转换矩阵colortransfer字段对应线性RGB和非线性RGB之间的转换函数colorprimaries字段对应RGBXYZ的转换矩阵ffprobeselectstreamsv:0showentriesstreamcolorspace,colortransfer,colorprimariestest。mp4〔STREAM〕colorspacebt2020nccolortransferaribstdb67colorprimariesbt2020〔STREAM〕 在如上的例子中,aribstdb67也就是我们所熟悉的HLG。 在MediaInfo中,Matrixcoefficients字段对应YUVRGB的转换矩阵Transfercharacteristic字段对应线性RGB和非线性RGB之间的转换函数Colorprimaries字段对应RGBXYZ的转换矩阵 除了如上的参数外,AVFramerange还用来存储视频中对应像素的每个分量的取值范围。在vfsetparams。c中也作了相关的定义说明:{limited,NULL,0,AVOPTTYPECONST,{。i64AVCOLRANGEMPEG},0,0,FLAGS,range},{tv,NULL,0,AVOPTTYPECONST,{。i64AVCOLRANGEMPEG},0,0,FLAGS,range},{mpeg,NULL,0,AVOPTTYPECONST,{。i64AVCOLRANGEMPEG},0,0,FLAGS,range},{full,NULL,0,AVOPTTYPECONST,{。i64AVCOLRANGEJPEG},0,0,FLAGS,range},{pc,NULL,0,AVOPTTYPECONST,{。i64AVCOLRANGEJPEG},0,0,FLAGS,range},{jpeg,NULL,0,AVOPTTYPECONST,{。i64AVCOLRANGEJPEG},0,0,FLAGS,range},5视频解码播放 转码之后的视频,可以通过各种渠道分发到终端用户进行消费。对于大部分显示设备,例如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数据的转换(色彩管理)以保证相同的视频在不同输入、输出、显示设备上都呈现出最好的颜色。 对于显示设备而言,sRGBRGB(Rec。2020)的转换过程如下所示: 因此,对于拍摄设备和显示设备的色域不同时,视频的播放增加了颜色管理的过程。 6视频观看 虽然视频信息的采集和最终终端播放采用的都是RGB的颜色模型,但是对人眼而言,RGB其实并不直观,比如我们很难马上反应出天青色的RGB色值? 为了能够更直观的表示颜色,又引入了HSL色彩模型。HSL比RGB更加直观,比如:想从黄色过度到红色,只需要调整色相即可,饱和度和亮度保持不变。因此,HSL一般更适合人的色彩感知,而RGB更适合显示领域。 为了让作品可以呈现出期望的效果,提升用户的视觉体验,在摄影后期,使用HSL对作品进行调整是最方便的一种方式。利用HSL对作品进行调整,简单几步就可以让灰暗的马路随拍秒变街头大片。 FFMpeg的signalstats滤镜可以分析获取视频的色调、饱和度、亮度信息。但是该滤镜获取的色调、饱和度和HSL中的计算是不一致的。 signalstats计算色调、饱和度的算法如下所示: 如果需要得到视频的标准HSL信息,可以使用作者开发的vfhsl滤镜。7结语 虽然颜色还是那个颜色,但是不同的颜色空间的适用范围并不相同:RGB:面向采集和显示设备YUV:面向存储HSL:面向人类视觉感知XYZ:RGB之间的转换桥梁 从视频采集到视频消费的整个过程,涉及到不同的设备和标准,而不同的设备和标准所支持的色域空间又不相同。正是通过不同的颜色模型转换和不同的色域转换,才得以让我们实现:在不同输入、输出、显示设备上都呈现出最好的颜色,才得以让我们实现以近似相同的观看体验来消费视频。 END 作者:百度Geek说链接:https:juejin。cnpost7153812732754542629