作者:Charles Poynton

www.poynton.com

poynton@poynton.com

在视频领域,计算机图形学和图像处理中的伽马(γ)代表一个数值参数,用以描述亮度重建时的非线性特性。关于伽马理论和实践的良好的理解,有助于创建、处理、显示图像时,获得更好的结果。

什么是光强度(intensity)?

光强度是指光源在单位立体角内辐射的光通量。在图像领域,我们测量一些电磁频谱范围之上的能量,并且通常聚焦于表面所发出或者附着的能量。光强度的单位类似于瓦特每平方米(我称之为线性光测量)。

CRT显示器通过一种非线性的方式,使用电压来控制颜色原件的光强度。CRT电压并不适合于反映光强度。

存储在文件(如TIFF、JFIF、PPM等)中的图像数据可能代表、也可能不代表光强度,尽管是如此被描述的。

什么是亮度(brightness)?

作为一种视觉感知特性,亮度是由CIE根据某个区域发出的光的多少所定义的。亮度是一种感知量(一个主观的量),表示人对光的强度的感受,并没有经过客观的测量。人眼感知的亮度与光强度成指数关系,而物理学定义的亮度和光强度成正比。

什么是明视度(luminance)?

CIE定义了明视度作为视觉的一个能量特性,以Y表示,通过对一个专门的感知函数加权计算得到。

明视度的量级与物理能量呈现比例关系。在这种情况下,它类似于光强度。

但是,明视度的光谱组成关系到人眼视觉的亮度感受。

明视度可以通过对线性R/G/B三原色的加权和计算得到。

对于当代的视频摄像机而言,计算参数如下:

在视频领域中,通常使用非线性R’/G’/B’分量加权和计算得到luma分量Y’。

尽管这个量值通常会被无用为明视度,但是它却不是明视度。

如果想要进一步了解物理光谱、感知亮度和其他颜色问题,可以参考《Frequently Asked Questions about Color》一文。

什么是明亮度(lightness)?

人眼视觉对于亮度的感应曲线是非线性的:一个具有参考明视度18%量级的光源表现在亮度上面大概为一半。

明亮度是指明视度的感知响应,并且被CIE定义为明视度的立方根:

Yn为参考白的明视度。如果针对参考白采用归一化处理,则不再需要进行除法运算。

CIE的定义采用了黑色附近的以903.3为斜率的一个线性变换部分。

线性部分对于实际应用是不重要的,但是如果不使用这一段,则需要确保L*的极限为0。

L*具有0到100的范围,并且使用ΔL*作为粗略的可视门限。

明亮度感知大体上呈现对数分布。你能够察觉到最小为1%的光强度差异。

对于经由指数为0.45的幂函数转换的RGB信号,视频系统接近于视觉明亮度响应曲线。此时可比较L*定义中的指数为1/3的幂指数。

什么是伽马(gamma)?

由物理设备所产生的光线的光强度通常不是实际信号的线性函数。传统的CRT对于电压遵循指数响应规律:显示器表面产生的光强度取决于所使用的电压,提高至指数为2.5的幂指数规律。这一指数函数的可量化值通常被称为伽马。为了确保正确的光强度重建,必须对该非线性进行补偿。

正如上文所提到的,人类视觉对于光强度具有非一致性的感知响应。如果光强度使用一个小的步长进行编码,比如256阶,然后为了最有效的感知可用编码,必须考虑到感知的性质。

下图展示了一个实际的CRT传输函数,包含了三种不同的图像控制设定:

上图展示了一个具有0~700mV电压范围的视频信号。在一个帧缓存卡的典型8bit数模转换器中,黑色的编码为0,白色为255。

这是一个惊人的巧合,光强度的视觉响应实际上是CRT非线性的反转。如果采用一个传输函数编码信号,以获得亮度感知性质的优点,一个类似于L*的函数,则编码将会被CRT所反转。

关于伽马的具体测量,请看Roberts[5]。

什么是伽马校正(gamma correction)?

在视频系统中,通过普遍存在于相机中的伽马校正,线性光强度被转换为非线性的视频信号。

Rec.709转换函数[2]将线性光强度(R)转换为非线性分量(R’),例如在一个视频系统中的电压:

在实际的相机和扫描仪中,接近黑色的线性部分弱化了传感器噪声的影响。

下图展示了Rec.709传输函数的曲线,信号范围为0~1:

一个理想的显示器会反转上述的转换过程:

真实的显示器没有办法达到等式中那么精确,并且没有线性部分,但是为了能够在线性光域中进行准确的中间处理,精确的定义是必须的。

在颜色系统中,相同的传输函数应用于RGB三原色分量(线性光),请见《Frequently Asked Questions about Color》。

另外,CRT的非线性是一个电子枪网格和阴极静电学的函数;与磷没有任何关系。

非线性是一个幂函数(形如f(x)=xa),而不是一个指数函数(形如f(x)=ax)。

更多的细节,请参见Poynton书中的Gamma章节[3]。

NTSC是否使用2.2的伽马?

通常电视的观看环境光线较暗。如果在一个较暗的环境中对一幅图像进行正确地物理光强度重建,环绕对比度的主观效应会对重建图像造成影响,导致对比度的缺失,如下图所示。

环绕效应:处于亮背景和暗背景中的三级相同灰阶,由于对比度的差异,会呈现出不同的感知效果,处于暗背景中的灰阶的对比度感觉要低于亮背景。

通过应用端到端的幂函数(幂指数为1.1或1.2),可以克服这一问题。

假设在CRT中的2.5的幂函数用于校正相机所使用的1/2.2的指数,而不是每个接收器都能够提供这种校正。

一个较暗观看环境的假设是建立在视频编码上。

PAL是否使用2.8的伽马?

625/50系统标准中提到关于指数为2.8的解码器,然而该值在实际应用中高的不切实际。如果选择一个不同于0.45的指数提供给Rec.709黑色附近的线性部分的幂函数所使用,则另一个参数需要改变,以维持函数和正切连续性。

我从网上获得一幅图像并且它看起来太暗了。

如果一幅图像以线性光形式创造,则需要应用一次伽马校正。如果没有使用伽马校正,直接将线性光图像显示在CRT上,中间色调就会变得太暗。如果做两次伽马校正,中间色调将会变得太亮。

我从网上获得一幅图像并且它看起来反差太强了。

计算的典型观看环境是相当明亮的。当根据视频标准对一幅图像进行编码时,其中暗含了周边环境的假设。如果没有在正确的明亮环境下得以显示,将会展现出强烈的反差。针对这种情况,应该采用指数为1/1.1或者1/1.2的幂函数对明亮环境进行校正。

计算机图像的变换很少会考虑到周边环境光线的影响。如果一幅图像产生于昏暗的环境,并且在一个明亮的环境下展现给观看者,接受者会发现其具有极端的对比度。

如果一幅图像生成于明亮环境,并且在一个明亮的环境下观看,则不会有任何问题。但是,它将会带有一个关于明亮观看环境的假设。视频标准是具有普遍性的,并且针对视觉进行了很好的优化,因此其通过使用一个指数为0.45的幂函数进行场景编码,针对假设的观看环境保持单一的标准。

长期看来,为了使每个人能够在图像应用交换的过程中得到最好的结果,当一个图像生成者传输图像时,需要能够排除其周边环境所造成的影响。一幅图像的接收者需要插入一个适合于其观看环境的传递函数。短期看来,你应该包含你的图像数据标签,用于编码的指定参数内容。TIFF 6.0具有对于这种数据的准备。你可以根据自己的观看环境进行合适的校正,但是直到图像变换标准合并了观看条件,你还是不得不为了图像生产者的观看环境进行补偿操作。

什么是luma

在视频领域,luma是亮度信息的标准表达,作为非线性R’G’B’分量的加权和,而不是真实CIE明视度的非线性函数。

更多的信息,请参见《Frequently Asked Questions about Color》。

什么是对比度?

对比度是指在特定设备或环境下的最亮的白色和最暗的黑色之间的光强度之比。投影电影或者照相反射打印,具有大约80:1的对比度。假定在起居室中的电视的对比度大约为30:1。典型的办公观看环境中,CRT显示器的对比度大约为5:1。

我需要多少比特用以平滑由黑到白的过渡?

在一个适合的指定等级,人眼视觉从黑到白响应大约100到1的光强度对比度。将这些光强度称为100和1。

在这一范围内,视觉能够辨别出两个光强度的差异,如果期间的对比度大概在1.01,相当于1%的对比敏感度。

为了实现这一范围的光滑过渡,以便于产生非可见的步长,必须在黑色一端通过编码表现不同的光强度等级,如1.00,、1.01、1.02等。如果使用线性光编码,必须维持0.01的差异直到白色。这就要求大约9900个码值,或者大约每个分量14比特的码长。

如果使用非线性编码,在黑色部分可以应用1.01作为比例,不用绝对的增长,并且像复利一样增长到白色部分。这种方法需要大约460个码值,或者大约每个分量9比特的码长。Rec.709中的非线性码长为8比特,对于数字广播电视大约50:1的对比度,这是足够的。

如果是较差的观看环境或显示器质量限制了对比度,那么需要使用更少的码长。

如果线性光系统被量化到一个小的比特数,黑色对应编码0,人眼对于临近光强度等级的1.01的对比度差异识别能力在编码100之下生效。如果一个线性光系统仅有8比特,则其整个范围为255,当观看环境不好时,在暗部区域就会观察到虚假轮廓(contouring)的问题。

如何在视频、计算机图形学、桌面运算等领域运用伽马?

综上所述,在视频领域,伽马校正有效地将编码统一到相同的感知域。在视频中,指数为0.45的幂函数用于相机,如下图所示。

合成电脑图像会估算光线和物体的相互作用。这些相互作用属于物理范畴,并且必须使用线性光值进行计算。计算机图像学习惯性地使用线性光值在帧缓存中存储图像数据,并且将伽马校正作为帧缓存输出的查找表映射,如图中的第二行所示。

如果线性光使用8比特,则编码中接近黑色的部分在平滑图像中就会出现带状问题。这是设计中8比特的瓶颈。

桌面计算机对于合成图像和视频均未进行优化。他们具有用于不同的标准可编程的伽马。因此,桌面计算机之间的图像转换是很困难的。

电压与光强度之间使用指数为2.5的幂函数,那么RGB编码值与电压之间是什么关系呢?

在一个伪彩色的帧缓存中,帧缓存中的每个像素值都是表现为颜色查找表;颜色查找表返回一组RGB值(如135/206/235)。每个映射值,加上或者减去一个黑场误差,与电压呈现比例关系。

在高彩帧缓存中(对于16比特颜色),红、绿、蓝各5比特,每个分量(0~31)加上或者减去一个黑场误差,与电压呈现比例关系。

在真彩帧缓存中,每个分量使用8比特,通过3个查找表(RGB各自对应一个查找表)映射到0~255的编码。每个查找表都对应一个专门的转换函数。映射应该由应用软件或者系统软件所决定;用户可能接触不到该映射,也可能没有很好的文档支持。每个映射值,加上或者减去一个黑场误差,与电压呈现比例关系。

关于更多的内容,请参见《Frequently Asked Questions about Color》。

Mac电脑的伽马是怎么样的?

苹果并没有关于非线性的定义,或者不严谨地讲,伽马是内置的。但是一个默认的查找表和标准显示器的组合使得光强度表现为指数为1.8的幂指数的趋势。从而错误地认为苹果电能使用的显示器的传递函数是不同于工业标准的。这一误解的根源在于非传统的QuickDraw的非线性运用。Mac电脑的编码过程如上图最下行所示。更多的细节请参见[4]。

计算中图像数据的转换采用了多样的的转换函数:编码端、帧缓存端、查找表端、显示器端。严格地讲,伽马应用于显示器端的幂函数。在Mac电脑中,你可以说伽马为1.4、1.8、2.5,这取决于正在讨论哪一部分。

我推荐使用Rec.709转换函数,指数为4.5,对于数字视频,其具有最好的感知性能和最大的转换便利性。如果你需要Mac电脑的兼容性,就不得不使用1/1.8的幂指数进行编码,以得到QuickDraw的1/1.45的查找表规律。这一编码对于桌面应用的明亮观看环境已经具有足够的性能,但是在昏暗的观看环境下,就需要忍受较高的对比度。

CRT的伽马是多样的?

适合于传统CRT的伽马范围为2.35~2.55。

CRT被认为是多样化的主要由于两个原因。第一,如果单纯地将光强度与电压的计算公式应用在带有黑场误差的显示器,则推导出的指数将会更接近于黑场误差的函数。第二,输入设备、图形库、应用程序都具有各自潜在的转换函数。来自这些源的非线性特性通常被归为伽马,或者错误地归咎为显示器。

我应该怎样调整显示器的黑场等级(Black Level)和图像控制(Picture Controls)?

对于CRT显示器,图像控制通常被迷惑性地贴上对比度调整的标签,调整全局的光强度。而黑场等级控制通常被迷惑性地贴上亮度调整的标签,调整偏移。显示一幅明显的黑场图片,通过调整黑场等级使得显示器能够在屏幕上重现真实的黑色,只是利用阈值将黑场附近的阈值内的像素调整为黑色对应的编码,但是阈值不能太高,而超出图像所基于的黑色灰阶的基础。当达到关键点时,会有一个超出黑场控制的区域。然后设定图像以满足个人的观看偏好。

应该针对线性数据还是非线性数据进行图像处理操作?

如果你希望仿真物理世界,线性光编码是必须的。例如,如果你想要生成一系列关于光线的傅里叶变换的仿真结果,需要使用线性编码。如果你想要对比你的模型与视频相机从真实世界采集到的转换图像,需要移除相机中的非线性伽马校正的影响,将图像数据转换到线性光表达。

另一方面,如果你的计算涉及到人类感知,则需要使用非线性表达。例如,如果你针对图像数据使用离散余弦变换进行图像压缩,像JPEG,你应该使用非线性编码,以展现感知格式,因为你希望最小化在量化过程中所引入的错误的感知。

图像处理的论文中很少区分线性和非线性编码。在JPEG和MPEG标准中,没有涉及转换函数,但是非线性编码却暗含其中:当对于线性光数据应用JPEG或者MPEG时,所得到的结果是无法接受的。在计算机图形学标准中,如PHIGS和CGM,也没有提及转换函数,但是线性光编码却暗含其中。这些差异性使得在不同系统之间进行图像转换相当困难。

当你询问一个视频工程师,是否其系统是线性的,他会说“当然”,因为参考的电压是线性的。如果你询问一个光学工程师,是否其系统是线性的,他会说“当然”,因为参考的是线性的光强度。但是,当一个非线性转换出现在两个系统之间时,像视频中,在一个领域中的线性转换在另一个领域中就不是线性的。

HIS、HSB、HLS和HSV中的I、B、L、V分别是什么含义?

为了令光强度的定义遵循能量的物理测量结果,HIS中的I应该表示线性光的量级。CIE已经定义了关于亮度的非客观测量,但是其明显是一个感知量级。明亮度是一个感知量级,由CIE精准定义。CIE没有定义V,但是各种不同的定义已在使用,比如孟塞尔值,并且它们都具有感知基础。

在用于计算机图形学的HSI/HSB/HLS/HSV的大多数公式中,量级被计算来自于RGB分量,但是并没有参考三原色的非线性,而是认为三原色的关系为线性光。因此,不可能辨别计算得到的HSI/HSB/HLS/HSV是表示物理的还是感知的量级。

HSI/HSB/HLS/HSV的亮度分量基于明视度(luminance),通过RGB分量的加权和计算所得。但是在常用的公式中,亮度分量的计算是通过RBG分量的最大值,或者三个分量的最大和最小值的平均值。这种高非线性计算引入到色调圆周中。

最后,由三原色通过HSI/HSB/HLS/HSV转换产生的颜色依赖于RGB三原色的色度,但是HSI/HSB/HLS/HSV的常用公式中没有一个符合基本色度描述。

出于这些原因,I、B、L、V的量级在计算机图形中的任何使用都是不可信的。

具体细节,请参见《Frequently Asked Questions about Color》。

印刷打印使用什么传输函数?

一幅中间色打印图像通常详细指明每个像素在电影中的点的百分比。一个图像排版的中间色机器生成点按照所要求的覆盖范围比例关系。原则上,在电影中的点的百分比是与线性光反射成反比的。

两种现象会扭曲所要求的点覆盖值。第一,打印涉及到墨水的机器涂抹,可能会导致点变大。第二,大批纸张中的光学作用引起更多的光线被吸收,跟单个点表面覆盖的期望有所差异。这些现象被划归为点增益,作为百分比来调节打印点的光线吸收超过要求的点覆盖范围。

标准的印刷打印采用的点增益大约为24%的50%:当需要50%吸收率时,实际得到74%的吸收率。中间色打印要比所要求的更暗。来自于编码到反射的传输函数的这个结果极为接近CRT的光电转换曲线。点增益的校正与视频中的伽马校正在概念上是相似的。在重建过程中的缺陷的物理校正能够很好地与人眼视觉亮度感知相匹配。在电影中的点百分比的图像编码涉及到在一个大体上感知一致空间的编码。标准的点增益函数应用于北美和欧洲,符合通过幂函数对数字编码重建得到的光强度,所使用的指数值大约为1.75,对比视频使用的2.2。这要低于感知的适宜性,但是对于印刷打印的低对比度则是更好的。

Mac电脑具有与打印相近的幂函数,送给排版部分的QuickDraw行编码会产生可接受的结果。高端排版软件允许用户指定点增益补偿参数。

我已经描述了传统印刷打印的线性。其它的中间色设备具有不同的特性,并且要求不同的校正。

参考文献

[1] Publication CIE No 15.2, Colorimetry, Second Edition. (Vienna, Austria: Central Bureau of the Commission Internationale de L’Éclairage, 1986)

[2] Recommendation ITU-R BT.709, Basic Parameter Values for the HDTV Standard for the Studio and for International Programme Exchange (1990) [formerly CCIR Rec. 709]. (Geneva: ITU, 1990)

[3] Charles Poynton, A Technical Introduction to Digital Video. New York: Wiley, 1996. Chapter 6, "Gamma" is available online at http://www.poynton.com/PDFs/TIDV/Gamma.pdf (Acrobat PDF format).

[4] Charles Poynton, “Gamma on the Apple Macintosh,” available on the Internet as <http://www.poynton.com/PDFs/Mac_gamma.pdf>.

[5] Alan Roberts, “Measurement of display transfer characteristic (gamma, g),” in EBU Technical Review 257, Autumn 1993, 32–40.

《GammaFAQ》,译名:关于伽马的常见问题及解答相关推荐

  1. python 视频 灰度 伽玛_Python 图像处理实战 | 图像的灰度非线性变换之对数变换、伽马变换...

    作者 | 杨秀璋 来源 | CSDN博客 责编 | 夕颜 头图 | 付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 本篇文章主要讲解非线性变换,使用自定义方法对图像进行灰度化处理,包 ...

  2. 图像亮度、对比度调节(伽马校正)

    [OpenCV学习]图像亮度.对比度调节(伽马校正) 作者:gnuhpc  出处:http://www.cnblogs.com/gnuhpc/ #include "cv.h" #i ...

  3. 《计算机视觉:模型、学习和推理》一3.6 正态逆伽马分布

    3.6 正态逆伽马分布 正态逆伽马分布(见图3-6)由μ和σ2两个参数定义,其中,前者可取任意值,后者仅取大于零的值.同样,该分布可以定义正态分布中参数方差和均值的分布. 正态逆伽马分布有4个参数α. ...

  4. OpenGL Gamma Correction伽马校正的实例

    OpenGL Gamma Correction伽马校正 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> # ...

  5. [Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  6. 第5章 Python 数字图像处理(DIP) - 图像复原与重建3 - 爱尔兰(伽马)噪声

    标题 爱尔兰(伽马)噪声 爱尔兰(伽马)噪声 爱尔兰噪声的PDF是 P(z)={abzb−1(b−1)!e−az,z≥00,z<0(5.7)P(z) = \begin{cases} \frac{ ...

  7. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波3 -幂律变换、伽马变换

    目录 幂律(伽马)变换 幂律(伽马)变换 s=crγ(3.5)s = c r^{\gamma} \tag{3.5}s=crγ(3.5) c和γc和\gammac和γ是正常数.考虑到偏移(即输入为0时的 ...

  8. 【机器视觉学习笔记】伽马变换(C++)

    目录 概念 C++源码 变换函数 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文内容节选自<数字图像处理> ...

  9. python怎么用gamma函数_如何通俗的理解伽马(gamma)函数

    如何通俗的理解伽马(gamma)函数 - 直觉,求导和示例 我为什么要在乎garmma分布? 使用伽马函数定义了许多概率分布,例如伽马分布,Beta分布,狄利克雷分布,卡方分布和学生t分布等. 对于数 ...

最新文章

  1. java菜单实现功能_Java实现超市库存管理系统
  2. 专题 13 IPC之信号量
  3. jQuery中的文档操作处理(五):append()、prepend()、after()、before()、wrap()、wrapAll()、wrapInner()、clone()等...
  4. Windows Server 2012正式版RDS系列⑥
  5. 现金流量表整理及开发
  6. mysql报错:Deadlock found when trying to get lock;
  7. XGBoost 与 Spark 在广告排序中的应用
  8. 记一次使用Dapper 进行的数据迁移和清洗工作
  9. 计算机组成原理汉字编码与校验设计实验报告(汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码)
  10. tc7102路由器虚拟服务器,电信华为tc7102路由器怎么设置
  11. 蚂蚁金服AntV开源地理可视化引擎 L7 2.0——聊聊AntV背后那些事
  12. 解读华为的流程与 IT 管理部门
  13. python3 QT5 端口转发工具 增加最小化隐藏 托盘显示 点击托盘恢复及托盘菜单
  14. linux权限管理详解
  15. Sublime Text 怎么使用打开md,替代Typora
  16. c语言零基础第三课:运算符学习
  17. Qt for WebAssembly in Windows
  18. 前端开发人员的桌面应用神器 Electron
  19. 《Android群英传》读书笔记---10.2(终篇)
  20. 重磅!《2022中国开源发展蓝皮书》正式发布

热门文章

  1. HTML之常用标签(续)
  2. 中冠百年|普通家庭应该如何进行理财投资
  3. 我的世界java版可以加mod吗_《我的世界》中国版局域网添加MOD图文教程 MOD添加方法...
  4. BlackBox:在不受信任的系统上保护容器安全
  5. @Html.DropDownListFor 下拉框绑定(选择默认值)
  6. [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果
  7. 数据库索引详解(mysql)
  8. [golang] golang实现截取字符串函数SubStr
  9. 小米note3android版本彩蛋,MIUI 10开发版8.12.13更新:小米MIX 3新增滑盖音效“江湖”彩蛋...
  10. Java:Java有多流行,有哪些主要应用程序?