Lena 像素版
在前面的文章《图像的表示(1)》里,我们提出了一个问题:从我们眼睛看见的『画面』,到我们用手机、电脑所处理的『图像数据』,其中经历了什么?从这个问题出发,我们探讨了『图像的定义是什么』和『图像成像的原理是什么』这两个问题,接下来我们继续探讨下个问题:『怎样对图像进行数学描述』。全文分为如下几节内容:
这篇的字数有点多,可以先点赞收藏,如果你能耐心读完,对于建立图像数学描述历程的初步认识,相信会有一些帮助。
从前文的介绍中,我们知道了感知图像的大致过程和其中的原理,那接下来要探讨的就是怎么对其建模和数学描述,这也是后续我们对图像进行数字化的基础。
颜色是对图像视觉感知最核心的要素,所以对图像进行数学描述,最重要的是建立『颜色模型(颜色空间)』。
颜色模型指的是在某种特定上下文中对颜色的特性和行为进行解释的方法。没有哪种颜色模型能解释所有的颜色问题,因此我们需要使用不同的模型来帮助说明我们看到的不同的颜色特征。
在实际应用中,针对某一类型的应用场景,人们还是希望尽量做到颜色模型的统一和兼容,所以我们经历了一系列颜色建模和标准制定的过程。下图是颜色标准制定的关键节点图:
其中,CIE 是国际照明协会的简称,他们是最早采用数学方式来定义颜色模型的。CIE 提出的颜色模型是从 1920 年代后期 W. David Wright(Wright 1928)和 John Guild(Guild 1931)做的一系列实验中得出的。他们的实验结果合并到了 CIE RGB 颜色模型的规定中,CIE XYZ 颜色模型再从它发展而来。
在后续的学术研究和工业应用中,很多新出的颜色模型就是以 CIE XYZ 为基础制定的。这其中就包括模拟电视时代 NTSC、PAL 和 SECAM 等制式标准推出的颜色模型。下图是模拟电视时代,NTSC、PAL 和 SECAM 三大制式应用分布图:
其中,北美、日本采用『NTSC 制式』(美国国家电视系统委员会),常被人提到的『NTSC 色域』其实是『NTSC 1953 色域』,也就是 NTSC 在 1953 年制定的彩色电视色域标准。我国和欧洲的模拟电视采用『PAL 制式』,其色域标准和 SECAM 制式一样,都是 EBU(欧洲广播联盟)色域。
接下来,我们就从 CIE RGB 开始并依次介绍 CIE XYZ、NTSC YIQ、PAL YUV 等颜色模型,最后到 ITU-R YCbCr 结束,这样就来到了我们目前在音视频开发中最常接触的 YCbCr 模型。希望在这一趟历程里能帮你梳理清楚『颜色』这个概念的发展脉络。
当光由两个或多个具有不同主频率的光源混合而成时,我们可以改变各个光源的强度来生成一系列其他颜色的光,这是一种构造颜色模型的方法,称为加色模式。其中用来生成其他颜色光源的色彩称为基色。通过基色可以产生的所有颜色的集合称为该颜色模型的颜色范围(色域)。如果两种基色混合则生成白色光,就称它们为互补色,比如红色和青色、绿色和品红、蓝色和黄色都是互补色。
加色模式通常应用于『有源物体』。一个能自己发出光波的物体称为有源物体,它的颜色由该物体发出的光波决定。物体发出对应颜色的光,被眼睛接收,则感应到对应的颜色。比如,太阳、电灯、显示屏等。 与加色模式对应的是『减色模式』,表示从光源中减去某些颜色后得到的颜色,比如 CMYK 就是一种减色颜色模型。减色模式通常应用于『无源物体』。一个自己不发出光波的物体称为无源物体,它的颜色由物体吸收的光波(或反射的光波)决定。第三方光源照到物体上,有的波长被吸收,有的波长被反射,被反射的光波被眼睛接收,从而感知到对应的颜色。比如,油画、印刷品等。
在实际的基本颜色中,没有哪一组集合能组合生成所有可见的颜色(我们后续可以通过色度图来说明)。但是,三种基色对多数应用来说是够用的,并且,不包含在指定基色集的颜色范围中的颜色仍然可以使用扩充的方法进行描述。
为了测试和量化上面提到的『人眼视觉感知三原色理论』,我们可以尝试选择适当的三种基色来混合以再现所有单色(单个波长)的颜色(单色光可以用棱镜或特殊制造的滤镜来获得)。国际照明协会(CIE)就这样干了,他们在 1931 年通过使用红、绿、蓝(波长分别是 700.0、546.1、435.8 nm)三种基色所进行的彩色匹配实验,标准化了 RGB 表示。
对应的 RGB 三基色的颜色匹配函数如下图所示:
图中的曲线是经过大量实验综合而得(对大量受试者的感知结果做平均),可以指定合成任何一种光谱颜色所需要的红、绿、蓝的量。其中需要注意的是,在 500 nm 附近的颜色需要从蓝光和绿光的混合光中再『减去』对应的红光得到(红光曲线在 500 nm 附近是负值)。由于这个『负光』的效果在 RGB 彩色显示器无法实现,所以 RGB 彩色显示器不能显示 500 nm 左右的颜色。
CIE 取得的这些实验结果也为具有不同光谱能量分布的同色光的存在提供了简单的解释,这样的光在感觉上是无法区分的。注意,两个纺织品或涂料颜色在一种照明下表现为具有不同光谱能量分布的同色光,并不意味着在另一种光照下也如此。
我们采用下图中在 RGB 坐标轴定义的单位立方体来描述 RGB 颜色模型。坐标原点表示黑色,其对角坐标点 (1, 1, 1) 表示白色,在三个坐标轴上的顶点分别表示三个基色,余下的顶点则代表每个基色的补色。
RGB 是一种加色模式,多种基色的量加在一起生成另一种颜色。立方体边界中的每一个颜色点都可以表示为三基色的加权向量和。
在 RGB 系统中,标准白光是按下列比例的 RGB 光通量混合而成:
光通量,是一种表示光的功率的物理量,单位为『流明(lm)』,用来衡量光源整体亮度的指标。指单位时间内由光源所发出或由被照物体所吸收的光能。
我们把 r、g、b 称为色度坐标,色度坐标舍弃了给定色彩样本的绝对亮度而只表示其纯色。由于 r + g + b = 1,因此任意颜色只需要 r、g 两个色度坐标进行描述即可,即色度空间是二维的。一般以 r-g 为色度坐标给出 RGB 颜色模型的色度图,如下图所示。其中标准白光位置在 (r = 1/3, g = 1/3) 处。
因为 RGB 模型中与『负光』混合所带来的种种问题,CIE 从数学上定义了三种标准基色 XYZ(是理论上的颜色,而非实际的颜色),形成了『CIE XYZ 颜色模型』。同时还定义了一组输出全部为正值的 『XYZ 颜色匹配函数』,指定了描述任何一种光谱颜色所需要的各基色分量,XYZ 颜色匹配函数是基于 RGB 三基色颜色匹配函数的线性组合。CIE XYZ 颜色模型是定义各种颜色的国际标准。并且使用 CIE 基色还能避免颜色的负值匹配问题,以及选择一组实际基色有关的其他问题。
根据这些条件,可以得到 RGB 模型与 XYZ 模型的转换关系:
和 RGB 模型一样,当我们只关心颜色的色度时,我们可以做归一化处理:
同样的,这里我们把 x、y、z 称为色度坐标,由于 x + y + z = 1,任意颜色可仅用 x 和 y 表示。一般以 x-y 为色度坐标给出 CIE XYZ 颜色模型的色度图,CIE 1931 年的 x-y 色度图如下所示:
上图中,曲线上的点是电磁光谱中的纯色,按波长的顺序从光谱的红色端到紫色端方向来标明,连接红色和紫色光谱点的直线称为紫色线,它不属于光谱。曲线内部的点表示所有可能的可见颜色的组合。其中 C 点对应与 (x = 1/3, y = 1/3) 的位置,表示白色。在实际中,C 点通常作为白光源或日光色度近似值。由于归一化的处理,色度图中没有亮度值。所有具有统一色度但不同亮度的颜色都映射到色度图中的同一点。色度图主要用于:
1)颜色范围
色度图中可以用直线段或多边形来表示颜色范围。
比如,如果用 C1 和 C2 两种颜色作为基色,它们的颜色范围就是它们的连线,下图中的 C1 到 C2 连线上的所有颜色可以通过混合适量的 C1 和 C2 颜色得到。如果 C1 占比大,则结果色就更接近 C1。
三点 C3、C4、C5 作为三基色的颜色范围是他们连成的三角形区域(包含边上)。三基色只能生成对应三角形区域的颜色。因此,色度图可以帮助我们理解为什么没有哪一个三基色组可以通过加色混合生成所有的颜色,因为没有一个三角形能包含所有的颜色。
在 CIE 色度图上可以很容易对比不同颜色标准的颜色范围,比如下图是几种不同标准的颜色范围:
下表是几种不同标准采用 RGB 三基色时在 CIE 色度图中的三角坐标:
R | G | B | |
---|---|---|---|
CIE | (0.735, 0.265) | (0.274, 0.717) | (0.167, 0.009) |
NTSC 制式 | (0.670, 0.323) | (0.214, 0.710) | (0.140, 0.084) |
PAL 制式 | (0.640, 0.330) | (0.290, 0.600) | (0.150, 0.060) |
彩色显示器 | (0.628, 0.346) | (0.268, 0.588) | (0.150, 0.070) |
2)互补色
前面有提到过,互补色是两个混合在一起为白色的颜色。又由于色度图上两种基色的颜色范围是一条线段,所以一对互补色在色度图上对应的两个点一定位于白色 C 点的两边,并且它们的连线经过 C。如下图所示,用一定量的 C1 和 C2 就可得到白色,C1 和 C2 与 C 的距离决定了产生白色所需的两种颜色的量。
3)主波长
在色度图中确定一种颜色的主波长要怎么做呢?以下图中的 C1 为例,我们可以从 C 通过 C1 画一条直线与光谱曲线相交于 Cs,这时候就可以认为颜色 C1 可以表示成白光 C 和光谱颜色 Cs 的混合,因此 C1 的主波长就是 Cs。
但这种确定主波长的方法不适用于 C 与紫色线之间的颜色点。以下图中的 C2 为例,我们画一条从 C 经过 C2 的直线与紫色线相交于 Cp,Cp 并不在可见光谱中,这种情况下,点 C2 称为非光谱颜色,它的主波长根据 Cp 的补点 Csp 得到,Csp 是从 C 经过 C2 直线的反向延长线与光谱曲线的交点。非光谱颜色是在紫-品红范围内,具有从白光减去主波长(如 Csp)的光谱分布。
4)饱和度
对于饱和度的计算,我们还是以上图中的 C1 颜色为例,我们通过沿 C 到 Cs 的直线计算 C1 到 C 的相对位置来确定饱和度。如果 dC1 表示从 C 到 C1 的距离,且 dCs 表示 C 到 Cs 的距离,我们可以按比率 dC1/dCs 来计算饱和度。在上图中,颜色 C1 的纯度大概是 25%,因为它位于 C 到 Cs 全程大约四分之一处。在 Cs 处颜色的饱和度为 100%
RGB 工业显示器要求一幅彩色图像由分开的 R、G、B 信号组成,而电视显示器则需要混合信号输入,为了实现对这两种标准的兼容,NTSC(美国国家电视系统委员会)制定了 『YIQ 颜色模型』,它的主要优点是可以实现对彩色电视和黑白电视的兼容,即可以用黑白电视收看彩色电视信号。
YIQ 颜色模型是以 CIE XYZ 颜色模型为基础来定义的,其参数 Y 与 XYZ 模型中的参数 Y 相同,表示图像的亮度信息。在没有色度的情况下,Y 也就对应于黑白图像,或者说黑白电视只接收 Y 信号。参数 I 包含有橙-青颜色信息,提供鲜艳色彩的明暗度。参数 Q 包含绿-品红颜色信息。
NTSC 组合颜色信号的设计允许黑白电视机从一幅占 6 MHz 带宽的图像信息中提取所需的灰度信息,因此,YIQ 信息必须在 6 MHz 带宽限制下编码。亮度值和色度值用不同的模拟信号进行编码,这样只是在原来的带宽内增加了颜色信息,黑白电视机仍然可以按原来的方式取得原样的亮度信号。
亮度信息(Y 值)以调幅的方式用带宽约为 4.2 MHz 的载波传输;色度信息(I、Q 值)被结合在一起用带宽约为 1.8 MHz 的载波传输。参数名称 I、Q 指的就是用来在载波上编码颜色信息的调制方法。后续还发展出了新的编码方法,这里就不多探讨了。
在 NTSC 信号中,亮度信息(4.2 MHz 带宽)的编码精度高于色度信息(1.8 MHz 带宽),这是因为人眼对亮度的变化比对色度的变化更敏感。因此,NTSC 用较低的精度传输色度信息并没有造成图像颜色质量的明显下降。
用于 NTSC 制式的 YIQ 可以与 RGB 之间进行转换(这里的 R、G、B 是经过伽马校正的,表示为 R’、G’、B’)。YIQ 的亮度信号 Y 为:
在实际使用中,上面的方程式通常会被缩放处理来简化 NTSC 制式数字信号的编解码实现。
上面提到过,因为 NTSC YIQ 的组合模拟视频信号中分配给色度信息的带宽较低,所以 NTSC YIQ 图像的颜色质量会受到一些影响。当我们开始追求更高的图像品质时,就需要改善这个问题了,这样就诞生了多种 YIQ 编码的变体来提高视频传输的颜色质量。『YUV 颜色模型』就是一种变体,它为 PAL 广播制式提供视频传输的组合颜色信息,它可以用不同的采样格式来调整传输的色度信息量。
YUV 颜色模型中用亮度、色度来表示颜色。它的亮度信息和色度信息是分离的,其中 Y 表示亮度通道,U 和 V 则表示色度通道。如果只有 Y 信息,没有 U、V 信息,那么表示的图像就是灰度图像。YUV 常用在各种影像处理场景中。YUV 在对照片或视频编码时,考虑到人眼对亮度信息的敏感度高于色度信息,允许降低色度的带宽。
在实际使用中,上面的方程式通常会被缩放处理来简化 PAL 制式数字信号的编解码实现。
YCbCr 颜色模型是目前广泛使用的一种 YUV 变体,它是为数字视频转换而设计的颜色模型。YCbCr 由 ITU-R(国际电信联盟无线电通信部门,前身是国际无线电咨询委员会 CCIR)在 ITU-R BT.601 首次制定,并在后续的 ITU-R BT.709、ITU-R BT.2020 等标准中都有涉及。
上面提到的 ITU-R BT.601/709/2020 系列标准,规定了彩色视频转换成数字图像时使用的采样率,RGB 和 YCbCr 两个彩色模型之间的转换关系等,它们分别面向标清电视(SDTV)、高清电视(HDTV)、超清电视(UDTV)应用场景。
它们对应的色域的 RGB 三基色以及白色点在 CIE 1931 x-y 色度图的坐标分别是:
R | G | B | 白色 D65 | |
---|---|---|---|---|
ITU-R BT.601/625 行 | (0.640, 0.330) | (0.290, 0.600) | (0.150, 0.060) | (0.3127, 0.3290) |
ITU-R BT.601/525 行 | (0.640, 0.340) | (0.310, 0.595) | (0.155, 0.070) | (0.3127, 0.3290) |
ITU-R BT.709 | (0.640, 0.330) | (0.300, 0.600) | (0.150, 0.060) | (0.3127, 0.3290) |
ITU-R BT.2020 | (0.708, 0.292) | (0.170, 0.797) | (0.131, 0.046) | (0.3127, 0.3290) |
1)用于 SDTV 的 YCbCr 与 RGB 的转换公式
2)用于 HDTV 的 YCbCr 与 RGB 的转换公式
在计算机系统中,如果可以保证 R’G’B’ 的取值范围为 0-255,则用下面的转换矩阵会更方便:
3)YCbCr 采样格式
常见的 YCbCr 的采样格式有:
以几个图来直观地表示 4:4:4、4:2:2、4:1:1、4:2:0 的采样方式:
4)YCbCr 存储格式
有时候,平面格式和紧缩格式会混合使用。
我们经常听到的 I420、YV12、NV12、NV21 等名词其实就对应着 YCbCr 各分量的存储方式。它们都属于 4:2:0 采样格式,只是按存储方式又分为两大类:
在前文介绍颜色模型的转换时,我们提到过伽马校正,但没有解释过它是干什么的,这里我们来探讨一下这个概念。
如果大家接触过更早的电视机或电脑显示器,应该知道一种叫做阴极射线管(CRT)的显示设备,这种设备的显示原理是使用一个电压轰击它的屏幕来发光以展示图像。人们在使用 CRT 时发现它有一个问题:调节电压为原来的 n 倍,对应的屏幕发光亮度并没有提高 n 倍,而是一个类似幂律曲线的关系,其公式粗略表示为:
典型的 CRT 显示器产生的亮度约为输入电压的 2.2 次幂,即在上述公式中 γ 为 2.2,这个称为显示伽马(display gamma)。
由于显示伽马问题的存在,在将图像输入到显示器之前需要对应的进行一个伽马校正(gamma correction),以使得最终显示出来的图像亮度与捕捉到的真实场景的亮度是成线性比例关系的。这里的伽马处理叫做编码伽马(encoding gamma)。这个处理过程通常是在图像采集设备的电路中完成的,比如对于 TV 摄像机,需要将感知到的亮度 Y 通过以典型的数值 1/γ = 0.45 做逆伽马重新映射:
这里伽马校正的非线性转换的过程除了解决显示伽马的问题外,还带来了一个有益的副效应:传输期间增加的噪声(模拟信号时代),在噪声比较明显的较暗信号区域(在接收器做了伽马校正后)会被减少。因为我们的视觉系统对相对亮度差别是敏感的,如下图所示,经过伽马校正后的非线性梯度明显对人眼感知来说更均匀:
在彩色电视发明后,R、G、B 信号会被分别做完伽马校正后再合起来编码(这也就是我们前文中表示的 R’、G’、B’)。
到如今,尽管在传输系统中我们不再有模拟噪声,但信号压缩时仍然需要量化,因此在传感数据上做伽马校正仍然是有用的。
不过,在计算机视觉的一些图像处理场景,需要图像的亮度信息在线性空间中才能进行,这时候则需要撤销伽马校正后再进行处理。在处理完成后,将图像输入显示器之前可能需要再重新做伽马校正。
所以,一个完整的图像获取和显示系统,需要至少两个伽马值:1)编码伽马(encoding gamma),体现了设备获取到的场景亮度值和编码像素值之间的关系;2)显示伽马(display gamma),体现了编码像素值和显示器亮度之间的关系。
而编码伽马(encoding gamma)和显示伽马(display gamma)的乘积就是整个图像系统的端到端伽马(end-to-end gamma)。如果这个乘积为 1,那么显示出来的图像亮度与捕捉到的真实场景的亮度就是成线性比例的。
当你的显示器已校准为 2.2 的标准伽马时,下图展示了在编码伽马确定时,不同显示伽马对系统端到端伽马的影响以及对最终图像展示效果的影响:
上面提到过,显示伽马是 CRT 显示器带来的问题,如今我们已经基本告别 CRT 显示器普遍使用 LCD 显示器了,那显示伽马的问题是不是就没有了呢?事实上,LCD 显示器本身确实没有 CRT 显示器的伽马效应,但是为了兼容性,LCD 以及其他非 CRT 显示设备都模拟了这个伽马效应以实现先前兼容。
(通过上文的探讨,我们知道了图像数字描述过程中对颜色进行建模的发展历程:基于人眼视觉感知三原色理论,CIE 通过大量实验数据建立了 RGB 颜色模型,标准化了 RGB 表示 → 为了解决 RGB 模型中与负光混合所带来的种种问题,CIE 从数学上定义了三种标准基色 XYZ,形成了 CIE XYZ 颜色模型 → 在模拟电视时代,RGB 工业显示器要求一幅彩色图像由分开的 R、G、B 信号组成,而电视显示器则需要混合信号输入,为了实现对这两种标准的兼容,NTSC 基于 XYZ 模型制定了 YIQ 颜色模型,实现了彩色电视和黑白电视的信号兼容 → 为了解决 NTSC YIQ 的组合模拟视频信号中分配给色度信息的带宽较低,而影响了图像颜色质量的问题,PAL 引入了 YUV 颜色模型,支持用不同的采样格式来调整传输的色度信息量 → 进入数字电视时代,ITU-R 为数字视频转换制定了 YCbCr 颜色模型,成为我们现在最常使用的颜色模型。在早年 CRT 显示器流行的年代,我们遇到了显示伽马问题,从而引入了伽马校正过程并延用至今。可见这一路都是遇到问题解决问题的过程。这些知识或许并不会在日常开发中用到,但知其然,又知其所以然,不亦乐乎。关于后续图像数字化的问题,我们将在下一篇来探讨,敬请期待)