计算机中图像的捕捉、存储与显示

计算机处理的图像,有的是抽象的图形,有的则是力求刻画或模拟现实世界的的照片。这里讨论后一种图像。

度量光线,度量视觉

可见光作为一种电磁辐射,可以套用很多物理量来度量,这些物理量及单位如下:

  1. 辐射功率(Power, W)
  2. 辐射强度(Radiant Intensity, W*sr{-1}),衡量单位立体角的辐射功率
  3. 辐照度(Irradiance, W*m^{-2}),衡量通过单位截面的辐射功率
  4. 辐照度(Randiance, W*m^{-2}*sr^{-1}),衡量通过单位立体角单位投影面积的辐射功率

可见光作为一种人眼接收的信号,让人眼形成有亮暗、颜色的视觉,为此可以专门定义一套物理量和单位度量。首先定义的物理量是发光强度(Luminous Intensity,cd),即单位立体角的波长加权的辐射功率。其次是光通量(Luminous Flux,lm=cd*sr),代表波长加权的辐射功率。cd 是国际基本单位,它的定义是 540*10^12Hz 的单色光 1 W 功率需要刚好对应 683 lm。类比上个列表,按照对应的顺序列出各个物理量及单位:

  1. 光通量(Luminous Flux, lm=cd*sr)
  2. 发光强度(Luminous Intensity, cd),衡量单位立体角的光通量
  3. 照度(Illuminance, lux=lm*m^{-2}),衡量单位面积的光通量
  4. 亮度(Luminance,cd/m^{-2}),衡量通过单位立体角单位投影面积的光通量

作为数量级的估算,太阳光的辐照度在 1000W*m^{-2} 的量级,其照度在 100000 lux 的量级。阴天时环境的照度在 1000 lux 的量级。黎明时分环境的照度在 1 lux 的量级。满月的照度在 0.01 lux 的量级。可以看出,自然环境中照度的范围差异是相当大的。

图像的捕捉

图像无非通过两种方式生成,一是数码相机捕捉,二是软件算法(如路径追踪 Path Tracing)的模拟/渲染。这两种图像中,每个像素都对应物理世界中的“亮度”(不严谨的说,大概对应照度或者辐照度)。由于亮度是一个连续的浮点值,所以原始的图像必然是以浮点数数列的格式存储的。这种格式被成为 HDR High Dynamic Range Imaging,因为它能够表示的亮度范围很广。只有这种形式,才能捕捉到自然环境中光的强弱差异(见上一节)。

图像的存储与显示

有时,希望把像素变成整数存储,很多图片格式(如 PNG 中彩色图像)给 RGB 三个通道分别分配一个字节的存储空间,相当于每个通道都有 {0,1,…,255} 这些码位可选。

根据韦伯定理,人类的感觉的差异是正比于 delta{S} / S 的,其中 S 为刺激的强度,delta{S} 为刺激的差异。换言之,想要人类产生感觉的差异,刺激强度至少需要提升到原先的 alpha (>1) 倍。对于视觉,前人的测量表明 alpha 的大概范围是 1.015~1.03。以此为依据,每 alpha 倍设置一个等级,第 k 个等级的亮度就是I*alpha^k。因此,一种自然的编码亮度的方式是每个码位对应一个等级,计算亮度的对数就得到了等级,计算等级的指数就得到了亮度。这种编码方式比等级正比于亮度的编码方式更符合人类感知的特点。

然而,出于历史原因,计算机软硬件选择使用的幂律函数 f(x) = x^(1/gamma)(个人电脑中常见的 gamma 为2.2)来编码亮度。由于对数函数和开根号(gamma = 2.2 时近似于开根号)函数形状相近,所以也是不错的选择。经约定,显示器将码位 k 转换为正比于 k^gamma 的亮度。

在常见的用 {0,1,…,255} 编码的情形中,假设亮度在 (0, 1) 的区间,可以通过如下方式转化亮度 (Intensity) 和码位 (code):code = round( 255 * intensity ^ (1/gamma) ),约定 gamma = 2.2。这样,显示器对应的亮度就是 code^gamma = C * intensity 了,正比例还原了捕捉图像时得到的亮度。这种编码方式称为 gamma correction。

这个技术标准造成了很多有趣的现象,如码位 127 是码位 254 亮度的四分之一,又如如果编码不正确没有开根号,那么显示器上显示的图片会更暗。

曝光度调节与色调映射

对于一般的 LCD 电脑屏幕,对比度(即像素最高亮度与最低亮度的比值)一般在 1000=10E3 的量级,然而,自然界中亮度的差异在10E7的量级(如第一节所述)。一张完美模仿自然的图片如果同时包含一个强光的区域和弱光的区域,那么注定无法让强光区域和弱光区域同时在一块屏幕上显示。

另一方面,上一节所述的编码方式中,码点 1 和码点 255 的亮度差异也只有 pow(255, 2.2) ~ 2E6,尚未达到浮点数的动态范围。

为了最终能够利用显示器显示图片,把高动态范围的图片转换到低动态范围上,就是不可避免的了。这个映射是色调映射 tone mapping。一种常见的色调映射的方式是 Reinhard 映射:x -> x/(1+x),能够把亮度映射到一个方便转换的 (0, 1) 区间。图像技术人员也提出了诸多其它的色调映射方式,如 ACES filmic tone mapping

在做色调映射之前,如果将每个像素的浮点亮度乘以一个常数,色调映射能够有效显示的浮点亮度范围就会相应地放缩。这个乘数通常是 2 的幂次,这个幂次就是曝光度。不难推知,使用正的曝光度,原始图片上的弱光区域就能有效显示,使用负的曝光度,原始图片上的强光区域就能有效显示。一张 HDR 图像,使用不同的曝光度,可能能够创建出很多展现不同光照区域的细节的 LDR 图像

Acknowledgement

上述技术细节的梳理,离不开对于 CS190I: Introduction to Offline Rendering 课程 slides 的学习和参考(访问 slides 需要 UCSB ID)。笔者尽力保证本博文中论述的准确性,不保证相对 slides 的一致性。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *