富有创造力的摄影师们在创作的时候,调整曝光,就会影响图像的亮度,而操纵影像的魔术师-修图师有时候会在工作时候去掉画面的饱和度,只留下灰白的亮暗信息,这也是一种图像的亮度信息。对于大部分人来说,亮度似乎是一个很简单的概念,无非就是它看起来有多“刺眼”,对吧。但对于定量的描述亮度,这事可就让人容易头疼了。“我们说的亮度,到底是什么亮度”
一些修过图的朋友可能知道,有一种很有魔力的玩意叫做HSL控件,它把原本用RGB描述的图像变成了更加倾向于肉眼感知的一种维度,即色调(俗称色相),饱和度(俗称鲜艳度),明度(俗称亮度),HSL工具可是独属于摄影师的一种极富有权力的魔术道具,因为它能够改变物体的客观颜色,我们可以通过把原本的H值映射到新的H值来实现对画面色调的重新映射。(这样一来我的蓝色款模型小跑车也能变成粉红色的兰博基尼了)。而有过比较深度的图像处理经验的朋友们应该想到了,或许我们可以拿到一个HSL图像的L通道,这不就是亮度通道了嘛。
于是你经过观察,发现L通道就似乎很好的反映了画面的亮暗关系,这可比用RGB的单一通道观察亮度好用多了。这不禁让我们回想起开头所说的修图师喜欢先抽掉画面的所有饱和度来观察亮度关系。因为在有些图像处理软件中,饱和度工具就是在HSL色彩模型中对S(饱和度)通道进行整体的增益,换而言之,我们如果要让一个RGB图像的饱和度归零,只需要把它先转换到HSL系统中,再把S通道全部乘0,再转换回RGB状态,这样我们就能拿到一张只剩所谓的亮度信息的图像了。
乍一看HSL真是世界上最牛逼的东西,它能把一张图像的色彩和亮度信息玩弄于股掌之间,而其中的L似乎完美的印证了人眼对亮度的感知。
不过先别急,总所周知,人类对颜色的鲜艳程度的不同也会有不同的亮度感知,那么我们先来看一下这张图片。你觉得哪个色块比较亮呢

你的感觉没错,红色,绿色,都似乎比我们画面的中性灰背景亮一点,似乎越鲜艳的颜色,我们肉眼感觉就会越亮。
接着我们用HSL工具来测量一下他们是否有这样的现象。

诡异的事情发生了,当我们观察这张图像转换到HSL之后,我们查看L通道,居然告诉我们红色和绿色这两个看起来最亮的颜色是最暗的。这跟我们肉眼所感知到的东西是完全相反的。
事情似乎变得复杂了起来,好像大家平时用的最多且最摄影师看好的HSL颜色系统也存在缺陷。L好像并不能很好的描述图像的亮度,那什么东西才能描述图像的亮度呢。
当你开始思考何为亮度的时候,恭喜你,你的数字影像处理生涯开始了从基于显示结果(Display Refered)迈向了基于场景光(Scene Refered)的思路转变。
首先我们先忘了上面所有的事情,我们来重新梳理一下几个与“亮度”相关的物理概念。
辐亮度:Radiance 表面一点处的面元在给定方向上的辐射强度除以该面元在垂直于给定方向平面上的正投影面积。单位是W/(sr·m²)
对于我们经常跟色彩打交道比较多的民工来说,我们用光谱仪测量一个物体时,拿到的第一级数据多半就是这样的辐亮度单位,而接触卫星数据处理的时候,亮度定标也多以用辐射亮度单位。也就是说,辐亮度单位是真正的用来描述物体发出来多少光能量的单位。
(光)亮度:Luminance描述光源或发光体(含反射体)的发射(或反射)光特性的一个物理量。数值上为在给定方向上单位投影面积、单位立体角内所发出的光通量,国际单位是坎德拉/平方米(cd/m²),或称尼特(nit)。
或许觉得还挺熟悉,显示器不就是经常用nit单位来评估亮度吗。
视亮度:(也称为视明度)Brightness描述的是人最终感知到的绝对亮感,不但与光能量有关还与光具体颜色有关。是一知觉的绝对量。
明度:Lightness描述物体或光源表面相对明暗特性的一个参量。它是在颜色系统中、同样的照明条件下,以白板作为基准,对物体表面的视知觉特性给予的分度。是颜色的三属性之一。是一知觉的相对量。
举个简单的例子,我们在明亮的房间里面对着白墙拿一个红色色卡,此时我们的感知更适合用明度来描述。
辐亮度关注的是辐射能量的分布情况,而光亮度则关注的是人眼感知到的亮度。辐亮度是一个物理量,描述光的辐射特性,而光亮度是一个生理量,描述人眼的感知。所以,光亮度的计算增加了明视觉函数,有时简称亮度。视亮度是人的大脑最终处理过的,比如(光)亮度相同的两个光源,一个白色一个红色,对于人来说红色感觉更亮;视亮度属于色貌研究范畴;明度则增加了与视觉范围白点的对比,是相对于白点视亮度的视亮度。
我们要描述光或者反射的物理强度可以用辐亮度,而描述眼睛接收到的就要用(光)亮度,忽略周围环境由大脑感受到的用视亮度,而考虑周围环境描述与白点相对的就用明度。第一个是纯物理的,第二个是有眼睛参与的,第三四个是实际生活中最常见的情况,前者是绝对的,后者是相对的。四者有关系,也有区别。
那么我在电脑屏幕上看到的图像的最终亮度,到底是如何来的。我们不妨重新想想一个场景是如何变成一个显示结果的。
一组物理的光,以光谱能量集合(Distribution)的方式进入相机的传感器,此时第一个滤光系统出现了,这就是相机的CMOS,每一个相机CMOS都有自己的光谱响应(SRF)特性,例如红色拜耳滤镜可能对680nm中心波长的光敏感,而其他波长的光则会衰减或者滤除。
这时候就出现了一个例外,假如一个700nm的红色光进入到了相机,但是相机的SRF对这个波长的光几乎没有反应,那么这组光可能最后就不会被相机捕获,这个颜色就无法重现在最后的照片中了。反过来,如果该相机的红色拜耳对红外线也有反应,那么即便是900nm这样的肉眼不可见(即视觉上亮度铁定为0)的红外光,也能被CMOS捕捉,并定义为红色,因此最后我们会看到照片里面的电磁炉下方发出了明亮的红色光,但我们肉眼却从未看到家里的电磁炉会发光这一现象。
因此,场景光经过了相机之后,其亮度关系已经和真实的辐射亮度不同,甚至有可能在极端条件下失衡,这一过程几乎不可能被完美反解。因为相机的运行逻辑可理解为把一个连续分布的功率谱进行了“降维”,也就是可能存在多对一的关系,因此我们无法知道这个“一”到底对应哪种能量分布。但好消息是,上段的现象在大部分情况下是肉眼难以察觉的,因为相机本身的SRF响应并不狭窄,自然界也很少有物体只发射非常窄的单色光。因此才有基于卢瑟定律和配色定律之后,我们能够看到与正常世界差不多的颜色。当然这里面还包含了利用SRF计算相机的三原色并进行色域校准等很多麻烦事,因为跟本文关系不大所以我们就不做讨论。
数码相机采集到图像之后,已经不存在绝对亮度关系,我们所得到的RAW图像里面的RGB值也是相对于传感器在当前的曝光下能承载的最大光(即满阱容量FWC)的值。但我们也能通过线性值来简易测量画面中的相对光比。这里还有个大前提是我们测量的通道与实际物体的亮度变化是否能存在线性对应关系。例如我们用R通道的值去测量拍摄到的红色色块和绿色色块的亮度就是无意义的,因为R通道肯定是对红色物体更敏感咯(即便绿色色块真的比它绝对亮度更大,在相机的R通道中,依然是更暗的。)这种玩法最直接的应用是来拍摄宽容度测试板,这些板由不同亮度的白块组成,因为都是白色色块,所以在辐亮度递增的过程中,其光谱分布不会变化,只是整体能量全部做倍数增加而已,因此选择RGB中的某一个通道来测量亮度比值是有意义的。同样的测量方法也适用于线性图像的简易光比测试,我们选择需要研究的通道,并寻找画面最暗和最亮的点,然后取Log2,就能得出相对于该通道下的光比【而非绝对场景中的光比】,有时候这也被称为画面内的动态范围。
场景-相机“亮度”传递过程中,亮度的意义发生了微妙的变化。在场景中,我们可以用所有的亮度概念来把真实世界中的亮度变成自己需要的计量单位,而经过了摄影机之后,辐射亮度已经失去了它的意义,因为CMOS的特有的响应会摧毁照片里面的绝对辐射亮度关系,因此我们只能用信号值来评估画面的亮度。而信号值可以被转换为多种色度vs亮度系统,例如最常见的HSL,HSV,Lab,Luv,还有广电领域的YCbCr(YUV),YPbPr,以及少见一些但是在色彩科学应用领域比较流行的CIE xyY,HSP,HSB,Jab,CIE Lch。这真是让人眼花撩乱,什么才是真正的亮度呢,就视觉而言,Lab这类感知均匀色彩空间从设计上更考虑了人眼所看到的绝对颜色,而HSL,HSV,YUV更像是为信号值设计的亮度概念,从运算来说,信号亮度的计算更为简单,也更适合在计算机中对比,而Lab这样的色觉亮度概念更适合描述最终所呈现给人眼的颜色,不过它们是非线性的,并不适合对画面RGB编码内容本身进行测量。因此一切亮度的描述都有其自身话语范围,得看我们要用来做什么研究。例如研究对摄影机来说的画面曝光变化,那我们甚至可以在RGB中直接测量数值,它的意义等同于测量场景光对于三个拜耳传感器造成的感受。而如果画面已经经过了一些非线性处理,我们要研究它在信号上甚至经过4:2:2 4:2:0编码之后的亮度变化,那就可以考虑使用YUV这样的模型。如果要研究图像处理级别的色彩稳定性,既可以用HSL也可以用Lab,它们的不同在于,色彩的变化对HSL系统来说是在色度轴线上进行旋转+缩放,Lab系统来说是在色度平面上进行位移,这个就看具体计算的时候要咋玩方便。
比如笔者曾经做过色相压缩器,这个在HSL中做就比较方便,因为只需要把H通道拿捏住,全部置于一个需要的值就行,同时依然保留了原有的固有饱和度,因为S通道并没有跟着动,而如果用Lab则需要同时操作两个轴,而且位移之后,物体的相对饱和度可能发生变化。反过来,如果要研究色差,那我们更应该用Lab系统,因为色彩在Lab系统上就是向量,是色彩点走过的距离,而在HSL中,并不能很好的表示色彩移动了多少。试想一下,如果我们试图在HSL的HS平面上移动颜色,同样移动0.2个单位,当色彩跨过中心线之后,伴随着的可是180度的天翻地覆的色相大旋转,而当色彩从边缘往中心移动0.2个单位,颜色无非就是少了一丢丢饱和度而已。而在Lab系统中,两个轴分别是红绿,蓝黄的均匀感知轴,意味着颜色在色度平面上位移的过程中,对人眼的感觉的变化量是差不多的。
总结下来,在图像数据层面,对画面内容的亮度进行研究,如果不考虑颜色变化,则可以直接用线性化后的RGB值作为相对的“通道亮度”来开展研究。如果要考虑颜色变化,则只能退而求其次,采用色度亮度分离的颜色系统中的亮度通道。但需要注意的是这里面的亮度轴与人眼色觉可能存在不完全对应的关系。
最常见的是在HSL和HSV之间做选择的时候,还是建议考虑获得了亮度之后的处理方法,如果测量出来的“亮度”是用于图像归一,那选择HSV可能会减少一些后续处理上困难,这是因为HSV是锥形的色彩模型,V不只决定画面能“亮到多白,还决定了饱和度,也就是说,在HSV系统中提高V,最后的视觉饱和度也会随之上升,并且当V达到最大值是,视彩度可以达到最大,而HSL系统中,当L达到最大时,无论饱和度通道如何,呈现出来都是白色,这有时可能与视觉可能会违背。尤其是HDR内容中,明亮的部分甚至具备更加丰富的颜色,如果采用HSL来调色,则明度升高之后,饱和度反而会下降,这可能与创作者的意图相违背,且对于动态影像的色彩稳定可能会更容易出现饱和度抖动的现象。
对SMPTE色块进行不同方式的增加亮度结果,只调整当前表色系统中具有亮度意义的轴。从上到下分别是:原始,HSL,HSV,Lab,YUV,可以多加留意不同色彩模型下对【同样色度但不同亮度】的样本的色调和饱和度的变化特性

刚刚我们讨论了一点点在RGB数据值上研究亮度的选择,接下来对于信号还剩最后一环,显示。
这一步决定呈现亮度的,一是照片的编码值,二是显示终端的亮度。举个简单的例子,我们在8bit图像中把一个255,255,255的颜色放到一个标称亮度为100nit的,按照sRGB校准的屏幕中,那它最后呈现在我们眼前的光亮度就是100nit,如果放一个127,127,127的色块到屏幕上,它便(却)会显示为20nit。
对呀,为什么不是50nit勒?这就涉及到屏幕的信号响应。目前我们所使用的屏幕都是模拟老式CRT显示器的响应(当然也做过很多修改,例如BT.1886,sRGB等等,具体本文也暂时不讨论),老CRT显示器的Gamma值约为2.2,这意味着我们发一个127的信号上去,实际的亮度值是100nit*(127/255)^2.2,约等于20nit,因此对图像做Gamma校正才能让图像在上了屏后依然保持和数据之间的线性关系。也就是我们视频工程师所说的OETF(光电响应函数) x EOTF(电光响应函数) = OOTF(光到光响应函数) = 1,OETF一般就是摄影机拍下的画面,EOTF一般就是指屏幕自身的gamma,由于数码相机是线性响应,因此我们要对线性图像进行Linear - 逆Gamma2.4这样的Gamma校正,让它变成EOTF ^ -1,这样才会有OETF逆 x EOTF=EOTF ^ -1 x EOTF=1=OOTF,这样的从前到后线性的画面,我们的肉眼才能看到正常的图像。
在实际显示应用中,OOTF大部分情况下并不是1,而是1.2,这也是一个遗留传统,关于这一点的原因我们可以未来再讲。
所以,当信号层的“亮度”达到最大的时候,我们会迎来什么颜色?
在HSL系统中,当亮度最大,所有的颜色都变成了白色,而在HSV系统中,亮度最大时,所有的颜色都达到了它能抵达的最大的饱和度,因此,HSV系统显得比HSL更适合用于HDR内容制作,也更接近现实生活的亮度色度关系,毕竟现实生活中,是不存在最大亮度这一概念的,而越亮的东西也通常看上去越鲜艳,例如夕阳下的火烧云,但HSV它很容易带来色度超标或者感知亮度和感知色度互相不匹配的问题,所以在应用层HSV也很少作为调色师的工作色彩空间。反而是HSL,因为其在SDR系统下非常符合人的逻辑,即亮度过曝之后就是纯白,因而被大量的摄影师,画师使用,PS这类图像软件以及诸如Matlab这些科学软件,还有一些天文图像处理系统都会把HSL作为最常用的亮度色度分离系统。
至于开头碰到的那种诡异的现象,则是人类很有意思的色貌现象,是人眼所特有的,当然也早就已有一个自己的名字:HK效应,Helmholtz–Kohlrausch Effect,如果有兴趣各位可以去自己了解它。至于预测HK效应并进行抵消,也早有不少色彩科学家做过尝试。例如Yoshinobu Nayatani就提出了针对自发光物体和反射物体的4种不同的HK效应预测,其核心算法是先将图像转换到L*u'v'这样的感知均一色彩空间中并输入到HK预测模型中,然后被原始图像相除。通过HK抵消之后,是不是几个色块相对就看起来视明度更一致了呢。


实际上为了研究这种视明度Brightness的量化,人类还开发了大量的色貌模型(CAM),这种模型不仅考虑了色彩本身,还考虑了各种眼睛的特性,包括不限于
观看条件对颜色的影响,即明亮环境中一个画面看起来可能更暗,对比度更高,而昏暗环境下一个画面看起来可能更亮,对比度更低(Bartleson-Breneman)
在锐利的明暗交界点上可能看到伪影
当适应了一个环境光的冷暖之后,其他的颜色相对感知都会变得正常,看白纸依然是白纸,看可乐依然是红色的。(色度适应性)
彩度和明度相辅相成,亮度上升,视彩度上升,环境亮度上升,白色的更白,黑色的更黑(Stevens/ Hunt效应)
这些现象是无法用常规的表色系统来预测的,因此人类做了大量的功夫把它们放到色貌模型中研究。
而服务于我们最多的就是色貌模型中的色度适应性转换(CAT),这个东西可以让我们在后期改变一张图像的感知白平衡。阅读更多 例如现在比较流行的CIE CAM02,它输入XYZ的色彩值,以及观看环境,并输出人眼视觉的色彩特性。
输入:CIE XYZ三刺激值,可由光谱刺激计算得到,或已知色彩值和色域反解得到
输入:XYZw,适应场的三刺激值,通常指代观察样本的观看环境
输出:
Brightness (Q) - 亮度:描述人眼感知到的颜色刺激的明暗程度的属性,与颜色的感知强度有关。亮度的感知受到颜色本身属性和观察条件的影响。
Lightness (J) - 明度:相对于白色或黑色的相对亮度的属性。它是一个主观的感受,通常与颜色的反射率有关。在色貌模型中,明度用来区分颜色是更接近白色还是黑色。
Colourfulness (M) - 色彩度:描述颜色的鲜艳程度或纯度。一个颜色如果色彩度高,那么它看起来更鲜艳、更纯净。色彩度与颜色的色度和亮度都有关系。
Chroma (C) - 色度:色度是描述颜色饱和度的属性,即颜色偏离灰色的程度。色度越高,颜色看起来越饱和,越不接近灰色。
Saturation (s) - 饱和度:饱和度是描述颜色纯度的另一个术语,与色度类似,它表示颜色中灰色成分的多少。饱和度越高,颜色越纯,越不含有灰色。
Hue angle (h) - 色调角:以角度表示。从0°开始,随着颜色的变化而增加,直到360°回到起点。
Hue composition (H) - 色调组合:在一些色貌模型中,色调组合用来描述颜色的复杂性,即一个颜色是否由单一色相组成,或者是由多个色相混合而成。
有关色貌模型的具体工作方式我们不在本文中讲解了,属于相对超纲的部分,在实际工作中,只需要学会使用即可。如果各位有兴趣,不妨自行寻找文献阅读。
