电磁波谱 (Electromagnetic Spectrum)

依照波长的长短、频率以及波源的不同,电磁波谱可大致分为:无线电波、微波、红外线、可见光、紫外线、x射线和伽马射线。

波长((\lambda))和能量((\Delta E))的关系:(\lambda \Delta E = 1239.9)

光谱 (Spectrum)

光谱可以看成是光子数目和波长的关系,又因为同样波长的光子,数目越多能量越大,所以也可以看成是波长和能量的关系。

然而基于上述关系构建的光谱渲染器(spectral renderer)代价太过高昂,因此考虑到使用红绿蓝的组合来模拟光(暂不考虑光的偏振,衍射和干涉等)。

人眼 (Human eye)

人的视网膜(retina)上的光度感应器(photodetector)是视杆细胞(rods)视锥细胞(cones)

视锥细胞(cones)在视网膜中央凹处(fovea)密度最大,而此处几乎没有视杆细胞(rods)视杆细胞(rods)视锥细胞(cones)的分布如下图所示。

视杆细胞是感受弱光刺激的细胞,对光线的强弱反应非常敏感,主要在弱光下发挥作用,不能辨别颜色。比如,猫头鹰视网膜中视杆细胞较多,故夜间活动视觉灵敏。视锥细胞则可以在正常明度下,为我们提供视觉信息。

实际上在视网膜上存在着三种用来感知颜色的视锥细胞,他们分别叫做S(Short)-视锥细胞M(Middle)-视锥细胞L(Long)-视锥细胞,对应着波长的短,中,长。

每种视锥细胞都对某一个特定波长的颜色异常敏感。一般来说,S-视锥细胞对波长420nm的光线最为敏感,M-视锥细胞530nm的波长最为敏感,而L-视锥细胞对于560nm的波长最为敏感。这也是为什么在计算机图形学中,颜色用红绿蓝三原色red-green-blue (RGB)来表示的原因。

三色理论 (Trichromatic Theory)

格拉斯曼颜色定律 (Grassmann’s laws)

  • Symmetry law
  • Transitive law
  • Proportionality law
  • Additivity law

配色实验 (Color Matching Experiments)

使用该实验确定的假想观察者,可将任意的可见光谱功率分布转换为一组三刺激值,从而量化地描述人类色觉。

简单来说,就是认为调整三种不同波长的单色光(波长为分别为435.8, 546.1, 700 nm)的组合,使其和另一种颜色匹配(同色异谱:一种颜色的再现与观察颜色的光源特性有一定的关系。),然后记录下这个波段的光对应的三原色的系数。得到下面的曲线。

加色与减色 (Additive vs Subtractive Colors)

色彩空间 (Color Space)

RGB色彩空间

由于每个显示设备有自己原色(primaries)的光谱分布(spectral distributions),所以即使有一张图片在RGB空间中定义,在不同设备上显示也可能不同。而且,使用RGB来表示颜色也有点不符合直觉,因为当我们看到“黄色”的时候,并不觉得是等同的“红”光和“绿”光混合成的,我们只觉得是一种“黄”色的光。所以,可以利用矩阵将RGB空间的转换为CIE color spaces或者它的变体(一个维度表示brightness,另外两个维度表示chromaticity)。

RGB色彩空间

Transformations for standard RGB color spaces

还有一种方法是使用更加直观的表示方法,即Hue-Saturation-Value (HSV) color space

Hue-Saturation-Value (HSV) color space

  • 色调(H, Hue): 用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。
  • 饱和度(S, Saturation): 表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高(颜色越鲜明),颜色的饱和度也就愈高。
  • 明度(V/B, Value/Brightness): 明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。

色调映射 (Tone Mapping)

色调映射(Tone Mapping/ Tone Reproduction),是在有限动态范围(dynamic range)媒介上近似显示高动态范围图像的一项计算机图形学技术。

本质上来讲,色调映射是要解决的问题是进行大幅度的对比度衰减将场景亮度变换到可以显示的范围,同时要保持图像细节与颜色等对于表现原始场景非常重要的信息

动态范围 (Dynamic Range)

动态范围是可变化信号(例如声音或光)最大值和最小值的比值。也可以用以10为底的对数(分贝)或以2为底的对数表示。

在传统图像中,每一个像素的RGB分别用用一位(byte)来表示,所以对于低动态范图像(Low Dynamic Range images),每个颜色通道仅有256个不同的值。所以要保存高动态范围成像(High Dynamic Range Imaging)需要很大的文件格式。

应用

为此,可以采用色调映射技术压缩高动态范围的图像的信息,得到的是JPEG格式图像。

另外,高动态范围成像(High Dynamic Range Imaging)的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度。但是,CRT、LCD、打印机以及其它图像显示方法只能显示有限动态范围的图像,这些设备是低动态范围(Low Dynamic Range)的。所以采用色调映射技术来将HDR图像呈现到低动态范围的显示设备上。

由于目前大多数显示设备基于8比特数模变换器(eight-bit D/A converters),所以可以把色调映射的过程看作是浮点数值到比特数的转换过程。

基于频率的方法 (Frequency-Based Operators)

假设图像中每个像素的亮度(luminance)近似于物体表面的反射率(reflectance)照度(illuminance)的乘积。

下标v表示使用(photometrically weighted quantities),取对数得到:

这样,成像被分成了反射率(reflectance)照度(illuminance)两个分量的叠加。

因为反射率(reflectance)低动态范围(Low Dynamic Range),而照度(illuminance)高动态范围(High Dynamic Range)的,如果能想办法分离这两个成分,主要压缩高动态范围(High Dynamic Range)部分即可。

对于典型的漫射场景,由于带纹理的表面以及表面边缘的存在,反射率分量倾向于表现出高空间频率(spatial frequencies)。而照度往往是空间上缓慢变化的函数。所以可以依据频率(使用傅立叶变换等方法)分离两个分量。压缩照度(illuminance)分量而保持反射率(reflectance)分量不变。

下面是一个应用例子,Bilateral filtering就是基于这个方法。

Bilateral filtering removes small details but preserves sharp gradients (left). The associated detail layer is shown on the right.

Gamma校正 (Gamma Correction)

原因

首先,我们的眼睛不像照相机那样感知光线。

当两倍的光子击中传感器时,传感器就接收到两倍的信号(“线性”)。而当我们感知到两倍的光的时候只是觉得亮了一点(非线性)。

与相机相比,人眼对暗色调的变化比对亮色调的变化更敏感。这种特性有一个生物学上的原因: 它使我们的视觉能够在更广泛的亮度范围内工作。

伽马矫正是我们眼睛的光敏感度和相机的光敏感度之间的转换。 当一个数字图像被保存下来时,它被“伽玛编码(gamma encoded)”—-使一个数字图像中两倍的数值我们所感知的两倍亮度的数值更为接近。

Gamma定义

  • Vout: 是输出亮度值。
  • Vin: 输入/实际亮度值。

gamma<1时,直线向上拱起,当gamma>1时则向下凹。

另外,伽玛编码图像能更有效地存储色调(tone)。

由于伽马编码将色调层次重新分配到更接近我们眼睛感知的层次,因此描述给定色调范围所需的比特更少。 也就是说,因为人眼对于暗色调更加敏感,伽马矫正就在暗色调区间划分了更多层,提高了存储空间的利用率。否则,过多的比特将用于描述较明亮的色调(相机相对更敏感,人眼较不敏感) ,而缺少比特将用于描述较暗的色调。

另外,如上图所示,伽玛编码将色调几乎均匀地在整个范围内划分(perceptually uniform)。

GAMMA WORKFLOW

Image Gamma

通常image gamma的设置嵌入在图像文件中,大多数图像设置gamma值为1/2.2,(如上图左一)。当相机将捕获的图像转换为标准JPEGTIFF文件格式时应用gamma将本地相机的色调层次重新分配到感知更加均匀的层次中。

Display Gamma

主要目的是补偿image gamma,使得图像显示在屏幕上有合适的亮度。更高的Display Gamma导致更暗且对比度更高的图像。

System Gamma

viewing gamma。为了更真实的再现一个场景,理想的情况是gamma = 1.0,那么Vout = Vin,即原场景的光与屏幕上显示的光相同。然而为了提高对比度,会设置gamma略大于1。这样可以弥补显示设备的动态范围(dynamic range)的限制。

Gamma correction is applied to the gamma encoded (compressed)
images to convert them back to the original scene luminance.

参考资料

  1. Stanford CS148 Introduction to Computer Graphics and Imaging (Fall 2019)
  2. Fundamentals of Computer Graphics, 4th Edition.
    Steve Marschner and Peter Shirley, A K Peters/CRC Press, 2015. (Ch21, Ch22, Ch23)
  3. OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3 (8th Edition) Dave Shreiner, Addison-Wesley Professional, 2013. (Ch7)
  4. Introduction to Light, Color and Color Space
  5. UNDERSTANDING GAMMA CORRECTION