编辑
2023-04-09
计算机图形学
00

目录

20.1 分类
20.2 动态范围
20.3 颜色
20.4 图像形成
20.5 基于频率的运算符
20.6 梯度域运算符
20.7 空间运算符
20.8 除法
20.9 Sigmoda 函数
20.10 其他方法
20.11 夜间色调映射
20.12 讨论

《Fundamentals of Computer Graphics》5th(计算机图形学基础/虎书),中文翻译。

第 20 章 Tone Reproduction 色调再现

如第 19 章所讨论的那样,人类视觉系统适应了广泛的观察条件。在正常观察下,我们可以分辨出大约 4 到 5 个对数单位的照明范围,即我们能看到细节的最亮和最暗区域之间的比率可能高达 100,000:1。通过适应过程,我们可以适应更大范围的照明。我们称适合人类视觉系统能力的图像为高动态范围。

视觉模拟通常产生高动态范围的图像(Ward Larson&Shakespeare,1998)。最近的图像捕获技术发展允许多个曝光被对齐并重新组合成单个高动态范围图像(Debevec&Malik,1997)。视频也有多曝光技术可用。此外,我们期望未来的硬件能够直接拍摄或拍摄高动态范围场景。一般而言,我们可以将每个像素视为三个浮点数字的三元组。

随着创建高动态范围图像变得更加容易,对显示此类数据的需求正在迅速增长。不幸的是,大多数当前的显示设备,包括显示器和打印机,只能显示大约 2 个对数单位的动态范围。我们认为这样的设备具有低动态范围。今天存在的大多数图像都是使用每个颜色通道的字节表示,这种表示方法可以匹配当前的显示设备,而不是场景本身。

通常,低动态范围图像不能表示场景而不丢失信息。一个常见的例子是室内房间通过窗户可见的户外区域。人类很容易看到室内和室外部分的细节。传统照片通常无法捕获此完整信息范围 —— 摄影师必须选择正确曝光的室内或室外部分(参见图 20.1)。使用高动态范围成像并使用本章描述的技术准备这些图像以进行显示可以避免做出这些决策(参见图 20.2)。

fig11_1.jpg

图 20.1。使用传统摄影技术,场景的某些部分可能会曝光不足或过度曝光。在左侧图像中,为了显示台球桌,窗外的景色被烧毁了。另一方面,如果这个场景的户外部分曝光正确,则台球桌将太暗。请与图 20.2 进行比较,该图显示了使用色调再现算法准备的用于显示的高动态范围图像。

fig11_1.jpg

图 20.2。使用最近的色调再现运算符(Reinhard&Devlin,2005)对高动态范围图像进行色调映射以供显示。在此图像中,室内部分和窗户透过的景色都被正确曝光。

有两种策略可用于显示高动态范围图像。首先,我们可以开发可以直接容纳高动态范围的显示设备(Seetzen,Whitehead 和 Ward,2003;Seetzen 等人,2004)。其次,我们可以为低动态范围显示设备准备高动态范围图像(Upstill,1985)。这目前是更常见的方法,也是本章的主题。虽然我们预见到高动态范围显示设备将在(不久的)未来广泛使用,但压缩图像的动态范围的需求可能会减少,但不会消失。特别是,像本书这样的印刷媒体天生就是低动态范围。

为了在低动态范围显示设备上显示一个图像而压缩其值的范围称为色调映射或色调再现。简单的压缩函数将图像归一化(参见图 20.3(左))。这构成了线性缩放,只有当图像的动态范围仅略高于显示设备的动态范围时才足够。对于动态范围更高的图像,小的强度差异将被量化为相同的显示值,从而丢失可见的细节。在图 20.3(中),所有大于用户指定最大值的像素值都设置为此最大值(即它们被截断)。这使得归一化不那么依赖于嘈杂的异常值,但我们在图像的亮区域丢失了信息。作为比较,在图 20.3(右)中,是一个色调映射版本,显示了暗区域和亮区域的细节。

fig11_1.jpg

图 20.3。高动态范围图像的线性缩放以适应给定的显示设备可能会导致丢失重要细节(左侧和中间)。左侧图像被线性缩放。在中间图像中,高值被限制。为了比较,右侧的图像经过了色调映射,使得暗区域和亮区域的细节都可以看到。

一般而言,线性缩放不适用于色调再现。色调再现的关键问题是在压缩图像的同时保留一个或多个图像属性。不同的色调再现算法专注于不同的属性,如对比度、可见细节、亮度或外观。

理想情况下,在低动态范围显示设备上显示色调映射图像将创建与原始场景相同的观察者视觉响应。考虑到显示设备的限制,这是不可实现的,尽管我们可以尽力尽可能接近达到这个目标。

例如,我们创建了图 20.4 所示的高动态范围图像。然后对该图像进行了色调映射并在显示设备上显示。然后将显示设备本身放置在场景中,以便它显示自己的背景(图 20.5)。在理想情况下,显示设备应该看起来透明。根据色调再现运算符的质量以及所描绘场景的性质,这个目标可能更或者更少地可达成。

fig11_1.jpg

图 20.4。用于说明图 20.5 中色调再现目标的图像。

fig11_1.jpg

图 20.5。在对图 20.4 中的图像进行色调映射并在显示器上显示后,将显示器放置在场景中,大约在拍摄图像的位置。根据色调再现运算符的质量,结果应该看起来像显示器是透明的。

20.1 分类

虽然可以按照它们旨在保留哪些属性或开发哪些任务来对色调再现算法进行分类,但我们根据它们的一般技术来分类算法。这将使我们能够展示许多不同操作员之间的差异和相似之处,因此,希望有助于针对特定的色调再现任务选择特定操作员。

我们遵循的主要分类方案依赖于一个认识,即色调再现操作员基于从各种学科获得的见解。特别是,几个操作员基于对人类视觉知觉的了解。

人类视觉系统使用位于视网膜中的光感受器检测光线。光被转换为电信号,在视网膜中部分处理,然后传输到大脑中。除了视网膜中的前几层细胞外,由检测到的光得出的信号使用脉冲列传输。信息携带的数量是这些电脉冲发生的频率。

人类视觉系统可以检测到的光的范围比人类大脑用于传输信息的频率范围要大得多。因此,人类视觉系统轻松地解决了色调再现问题-大范围的亮度被转换为脉冲列的小范围频率。因此,模仿人类视觉系统的相关方面是进行色调再现的可行方法;本节将更详细地解释这种方法。

第二类运算符基于物理学。光在被感光器吸收之前与表面和体积相互作用。在计算机图形学中,通常使用渲染方程模拟光的交互。对于纯粹的漫反射表面,此方程可以简化为表面接受的光(照度)和该表面反射光线的能力(反射率)的乘积(Oppenheim,Schafer 和 Stockham,1968 年)。

由于反射率是表面的被动属性,因此对于漫反射表面而言,它根据定义是低动态范围的-通常介于 0.005 和 1 之间(Stockham,1972)。表面的反射率不能大于 1,否则它将反射比其自身接收到的光更多的光。另一方面,照度可以产生任意大的值,并且仅受光源的强度和接近程度限制。

因此,图像的动态范围主要由照度组件控制。在面对漫反射场景时,因此进行色调再现的一种可行方法可能是将反射率与照度分离,压缩照度组件,然后重新组合图像。

然而,假设场景中所有表面都是漫反射的假设通常是不正确的。许多高动态范围图像描绘了亮点和/或直接可见的光源(图 20.3)。由镜面表面反射的亮度可以几乎与它所反射的光源一样高。

目前使用的各种色调再现算法将图像分成高动态范围基础层和低动态范围细节层。如果所描绘的场景完全是漫反射的话,这些层将代表照度和反射率。对于包含直接可见光源或高光的场景,分离为基本层和细节层仍然允许设计有效的色调再现算法,尽管不能直接在这些分离的层上附加含义。这类算法在第 20.5 节中进行了讨论。

20.2 动态范围

传统图像每个颜色通道以一个字节的形式存储。这种编码提供的动态范围取决于最小和最大可表示值之间的比率,以及相邻值之间的步长大小。因此,对于低动态范围图像,每个颜色通道只有 256 个不同的值。

高动态范围图像编码了一组可能值明显更大的值;最大可表示值可能要大得多,并且相邻值之间的步长可能要小得多。因此,高动态范围图像的文件大小通常也更大,尽管至少有一种标准(OpenEXR 高动态范围文件格式(Kainz,Bogart 和 Hess,2003))包括一个非常强大的压缩方案。

图 20.6 动态范围为 2.65log22.65 \log_2 单位

图 20.7 动态范围为 3.96log23.96 \log_2 单位

图 20.8 动态范围为 4.22log24.22 \log_2 单位

图 20.9 动态范围为 5.01log25.01 \log_2 单位

图 20.10 动态范围为 6.56log26.56 \log_2 单位

限制文件大小的另一种方法是将色调再现算法应用于高动态数据。然后可以使用 JPEG 格式对结果进行编码。此外,输入图像可以按像素除以经过色调映射的图像。

然后可以对此除法的结果进行子带采样,并将其作为少量数据存储在同一 JPEG 图像的头部中(G.Ward&Simmons,2004)。这类子带编码图像的文件大小与传统的 JPEG 编码图像的文件大小相当。显示程序可以直接显示 JPEG 图像,也可以通过将经过色调再现的图像乘以存储在头部中的数据来重构高动态范围图像。

一般来说,最小步长和可表示的最小和最大值之比的组合决定了图像编码方案提供的动态范围。对于计算机生成的图像,在将其写入文件或显示屏幕之前,通常将图像存储为浮点值三元组,尽管可能存在更有效的编码方案(Reinhard,Ward,Debevec 和 Pattanaik,2005 年)。由于大多数显示设备仍配备有 8 位 D / A 转换器,因此我们可以将色调再现视为将浮点数映射到字节的过程,以便结果可以在低动态范围显示设备上显示。

个别图像的动态范围通常较小,并且由场景中发现的最小和最大亮度确定。因此,衡量图像的动态范围的简单方法可能计算图像的最大和最小像素值之间的比率。通过忽略最暗和最亮像素的少量百分比,可以减少对异常值的敏感性。

或者,可以在对数域中表达相同的比率差异。这种度量方法对离群值的敏感性较低。本页边距上显示的图像是具有不同动态范围的示例图像。请注意,这种情况下的夜景并不比白天场景具有更小的动态范围。虽然夜景中的所有值都较小,但最大和最小值之间的比率是相同的。

但是,记录设备或渲染算法可能会引入噪声,这会降低有用的动态范围。因此,衡量图像的动态范围应考虑噪声。因此,动态范围的更好度量方法将是以分贝表示的信噪比,这在信号处理中使用。

20.3 颜色

色调再现运算符通常压缩亮度值,而不是直接处理彩色图像的红色,绿色和蓝色分量。在将这些亮度值压缩为显示值 Ld(x,y)L_d(x,y) 之后,可以通过保持颜色通道之间的比率与压缩前相同的方式重构彩色图像(使用 s=1s = 1)(Schlick,1994b):

Ir,d(x,y)=(Ir(x,y)Lv(x,y))sLd(x,y),Ig,d(x,y)=(Ig(x,y)Lv(x,y))sLd(x,y),Ib,d(x,y)=(Ib(x,y)Lv(x,y))sLd(x,y).\begin{aligned} I_{r, d}(x, y) & =\left(\frac{I_{r}(x, y)}{L_{v}(x, y)}\right)^{s} L_{d}(x, y), \\ I_{g, d}(x, y) & =\left(\frac{I_{g}(x, y)}{L_{v}(x, y)}\right)^{s} L_{d}(x, y), \\ I_{b, d}(x, y) & =\left(\frac{I_{b}(x, y)}{L_{v}(x, y)}\right)^{s} L_{d}(x, y) . \end{aligned}

结果经常出现过饱和的情况,因为人类色彩感知相对于整体亮度水平是非线性的。这意味着,如果我们在昏暗的环境中在显示器上查看明亮的户外场景图像,则我们的眼睛适应于昏暗的环境而不是户外照明。通过保持颜色比例不变,我们没有考虑到这种效果。

或者,饱和度常数 s 可以选择小于一。这种通道特定的伽马校正可以将结果去饱和到适当的水平,如图 20.11 所示(Fattal,Lischinski 和 Werman,2002 年)。更全面的解决方案是将色彩外观模型领域的思想纳入色调再现运算符中(Pattanaik,Ferwerda,Fairchild 和 Greenberg,1998; Fairchild&Johnson,2004; Reinhard&Devlin,2005)。

fig11_1.jpg

最后,如果已经有一个具有代表性的颜色方案的示例图像可用,则可以将此颜色方案应用于新图像。这种在图像之间映射颜色的映射可用于微妙的颜色校正,例如饱和度调整或更创造性的颜色映射。映射过程通过将源图像和目标图像转换为非相关颜色空间来进行。在这样的颜色空间中,每个颜色通道中的像素值可以独立处理而不会引入太多伪影(Reinhard,Ashikhmin,Gooch 和 Shirley,2001)。

然后,在非相关颜色空间中从一个图像到另一个图像映射颜色很简单:分别计算三个颜色通道中源图像和目标图像的所有像素的均值和标准差。然后,移位和缩放目标图像,以便在每个颜色通道中,目标图像的均值和标准差与源图像相同。然后通过从非相关颜色空间转换为 RGB 并将负像素夹紧到零来获得结果图像。由于应用此算法可能会导致图像的动态范围发生变化,因此建议在高动态范围图像上应用此算法,然后再应用传统的色调再现算法。适合的非相关颜色空间是第 18.2.4 节中的对手空间。

将这种颜色转换应用于图 20.12 中的图像的结果显示在图 20.13 中。

fig11_1.jpg

图 20.12。用于演示颜色转换技术的图像。结果显示在图 21.13 和 21.31 中。

fig11_1.jpg

图 20.13。左侧的图像用于调整图 20.12 中显示的图像的颜色。右侧显示结果。

20.4 图像形成

目前,我们假设图像是由光线被物体扩散反射而成的。在第 20.5 和 20.6 节中,我们放宽了这个限制,以直接描绘场景中的光源和高光。每个像素的亮度 Lv 然后通过以下乘积近似:

Lv(x,y)=r(x,y)Ev(x,y)L_{v}(x, y)=r(x, y) E_{v}(x, y)

这里,r 表示表面的反射率,Ev 表示照度。下标 v 表示我们使用光度加权量。或者,我们可以在对数域中写出此表达式(Oppenheim 等人,1968 年):

D(x,y)=log(Lv(x,y))=log(r(x,y)Ev(x,y))=log(r(x,y))+log(Ev(x,y)).\begin{aligned} D(x, y) & =\log \left(L_{v}(x, y)\right) \\ & =\log \left(r(x, y) E_{v}(x, y)\right) \\ & =\log (r(x, y))+\log \left(E_{v}(x, y)\right) . \end{aligned}

摄影透明度通过改变材料的密度记录图像。在传统摄影中,这种变化与亮度具有对数关系。因此,类比于摄影中的常规做法,我们将使用密度表示 (D)(D) 来表示对数亮度。当在对数域中表示时,反射率和照度变为可加。尽管隔离反射率或照度是一个欠约束的问题,但这有助于分离这两个组件,这是图像形成的一个基本问题。实际上,分离只能在一定程度上进行,并且取决于图像的构成。尽管如此,色调再现可以基于分离图像形成的这两个组件,如下两节所示。

20.5 基于频率的运算符

对于典型的扩散场景,由于纹理表面和表面边缘的存在,反射率分量往往表现出高空间频率。另一方面,照度倾向于在空间上是一个缓变函数。

由于反射率具有低动态范围而照度具有高动态范围,因此我们可以尝试分离这两个分量。两者都具有频率依赖性,因此我们可以计算图像的傅里叶变换,仅衰减低频。这会压缩照度分量,同时使反射率分量基本不受影响-我们所知道的第一个数字色调再现运算符采用了这种方法(Oppenheim 等人,1968 年)。

最近,其他运算符也遵循这种推理方式。特别地,双边和三边滤波器被用于将图像分成基础层和细节层 (Durand&Dorsey,2002; Choudhury&Tumblin,2003)。两个滤波器都是保边平滑运算符,可以以多种不同的方式使用。将保边平滑运算符应用于密度图像会导致模糊图像,其中尖锐的边缘仍然存在(图 20.14(左))。我们可以将这样的图像视为基础层。如果我们然后通过像素分割将高动态范围图像除以基本层,我们就会得到包含所有高频细节的细节层(图 20.14(右))。

fig11_1.jpg

图 20.14。双边滤波器去除了小细节,但保留了尖锐的梯度(左)。相关的细节层显示在右侧。

对于扩散场景,基础层和细节层类似于照度和反射率的表示。对于描绘高光和光源的图像,这种平行不成立。然而,无论图像的内容如何,都可以将图像分解为基础层和细节层。通过在重新组合为压缩的密度图像之前压缩基础层,可以创建低动态范围密度图像(图 20.15)。经过指数化后,得到可显示的图像。

fig11_1.jpg

图 20.15。使用双边滤波的图像色调映射。图 20.14 中显示的基本层和细节层在压缩基本层后重新组合。

保边平滑运算符还可用于计算每个像素的局部自适应级别,该级别可用于空间变化或局部色调再现运算符中。我们在第 20.7 节中描述了这种使用双边和三边滤波器的方法。

20.6 梯度域运算符

在前一节中,针对基于频率的运算符所作的论点也适用于梯度场。假设没有光源直接可见,反射率分量将是一个具有梯度场中尖锐峰值的常函数。类似地,照度分量将导致各处存在小梯度。

人们通常能够分离典型场景中的照度和反射率。在打折扣后评估表面反射率的感知被称为亮度。为了评估仅描绘扩散表面的图像的亮度,B.K.P Horn 最早使用梯度场来分离反射率和照度(Horn,1974 年)。他使用简单的阈值去除所有小梯度,然后积分图像,这涉及使用完全多重网格方法解决泊松方程(Press、Teukolsky、Vetterling 和 Flannery,1992)。

结果类似于保边平滑滤波器。这符合预期,因为 Oppenheim 的基于频率的运算符在场景反射性和图像形成的相同假设下工作。特别是,霍恩的工作直接针对“蒙德里安的迷你世界”,这些是类似于著名荷兰画家彼得·蒙德里安的抽象画作的简化版扩散场景。

由于大多数高动态范围图像描绘了光源,因此无法直接将霍恩的工作用作色调再现运算符。然而,一个相对较小的变化将使这项工作成为适合的色调再现运算符。如果图像中描绘了光源或镜面表面,则大的梯度将与光源和高光的边缘相关联。这会导致图像具有高动态范围。在图 20.16 中显示了一个例子,其中斯诺克球上的高光导致尖锐的梯度。

fig11_1.jpg

图 20.16。左侧的图像(使用梯度域压缩进行色调映射)显示具有高光的场景。这些高光显示为右侧的大梯度,其中梯度的幅度映射到灰度(黑色是 0 梯度,白色是图像中的最大梯度)。

因此,我们可以通过衰减大梯度而不是阈值化梯度场来压缩高动态范围图像。这种方法是 Fattal 等人采取的,他们表明通过积分已压缩的梯度场可以成功地压缩高动态范围图像(图 20.17)(Fattal 等人,2002)。Fattal 的梯度域压缩不仅限于扩散场景。

fig11_1.jpg

图 20.17。使用梯度域压缩进行色调映射的图像。

20.7 空间运算符

在接下来的几节中,我们将讨论对像素直接应用压缩而不对其他域进行转换的色调再现运算符。通常区分全局和局部操作符。前一类中的色调再现运算符会根据每个像素相同的压缩函数改变其亮度值。 全局一词源于许多这样的函数需要以某些由分析整个图像确定的值为锚定点。实际上,大多数运算符使用几何平均值 L¯υ来指导压缩:

Lˉv=exp(1Nx,ylog(δ+Lv(x,y)).(20.1)\bar{L}_{v}=\exp \left(\frac{1}{N} \sum_{x, y} \log \left(\delta+L_{v}(x, y)\right) .\right. \tag{20.1}

在公式(20.1)中,引入了一个小的常数δ,以防止平均值在存在黑色像素时变为零。通常将几何平均值映射到预定义的显示值。将几何平均值映射到不同显示值的效果如图 20.18 所示。或者,有时使用最小或最大图像亮度。设计全局运算符面临的主要挑战在于选择压缩函数。

fig11_1.jpg

图 20.18。将几何平均值映射到不同显示值后应用的空间色调映射运算符(左:0.12,右:0.38)。

另一方面,局部操作符根据从选择的相邻像素派生的信息压缩每个像素,而不是整个图像。其基本原理是,在明亮的邻域中的亮像素可能与暗邻域中的亮像素不同。在开发局部运算符时,设计挑战包括选择压缩函数,每个像素的局部邻域的大小以及使用局部像素值的方式。通常情况下,局部运算符比全局运算符实现更好的压缩(图 20.19),尽管计算成本更高。

fig11_1.jpg

图 20.19。每个图像的全局色调再现运算符(左)和局部色调再现运算符(右)(Reinhard、Stark、Shirley 和 Ferwerda,2002)。局部运算符显示更多细节;例如,右侧的金属徽章显示更好的对比度,高光更加清晰。

全局和局部运算符通常受到人类视觉系统的启发。大多数运算符采用两种不同压缩函数中的一种,这与局部和全局运算符的区别正交。显示值 Ld(x,y) 最常通过以下两种函数形式之一从图像亮度 Lv(x,y) 派生:

Ld(x,y)=Lv(x,y)f(x,y)(202)\begin{aligned} L_{d}(x, y) & =\frac{L_{v}(x, y)}{f(x, y)} \tag{202} \end{aligned}
Ld(x,y)=Lv(x,y)Lv(x,y)+fn(x,y)(20.3)\begin{aligned} L_{d}(x, y) & =\frac{L_{v}(x, y)}{L_{v}(x, y)+f^{n}(x, y)} \tag{20.3} \end{aligned}

在这些方程中,f(x,y)f(x,y) 可以是一个常数或每个像素变化的函数。在前一种情况下,我们有一个全局运算符,而空间变化的函数 f(x,y)f(x,y) 会导致局部运算符。指数 nn 通常是对于特定运算符固定的常数。

公式(20.2)将每个像素的亮度除以从整个图像或局部邻域派生的值。公式(20.3)在对数线性图上具有 SS 形曲线,因此被称为 Sigmoda 函数。这种函数形式适合测量各种物种中光电受体对光闪烁的电响应的数据。在接下来的几节中,我们将讨论这两种函数形式。

20.8 除法

可以通过将每个像素除以一个常数来将高动态范围图像带入可显示范围。这样的除法实质上构成线性缩放,如图 20.3 所示。虽然图 20.3 显示了特定情况下的线性缩放,但可以通过使用心理物理数据推导出方程(20.2)中的缩放常数 f(x,y)=kf(x,y)= k 进行精细调整 (G. J. Ward,1994; Ferwerda,Pattanaik,Shirley 和 Greenberg,1996)。

或者,存在几种方法来计算具有空间变化的除数。在这些情况下,f(x,y)f(x,y) 是图像的模糊版本,即 f(x,y)=Lυblur(x,y)f(x,y)=Lυblur(x,y)。模糊效果是通过用高斯滤波器卷积图像来实现的(Chiu 等人,1993; Rahman,Jobson 和 Woodell,1996)。此外,在用模糊图像计算 f(x,y) 时,也可以结合白点偏移以进行颜色外观建模(Fairchild 和 Johnson,2002; G.M. Johnson&Fairchild,2003; Fairchild 和 Johnson,2004)。

高斯滤波器的大小和权重对最终的可显示图像有深远影响。高斯滤波器具有选择加权局部均值的效果。因此,色调再现是将每个像素除以其相关的加权局部均值。如果选择的滤波器核大小太小,则会出现光晕伪影(图 20.20(左))。光晕是局部运算符常见的问题,尤其是在依赖于除法的色调映射时更为明显。

fig11_1.jpg

图 20.20。通过除以高斯模糊版本进行色调映射的图像。左侧图像的滤波器核大小为 64 像素,右侧图像的滤波器核大小为 512 像素。对于基于除法的算法,通过选择大的滤波器核可以最小化光晕伪影。

一般来说,通过使滤波器核变大可以最小化这种方法中的光晕伪影(图 20.20(右))。通过选择至少占图像四分之一大小的滤波器大小,可以获得合理的结果。有时甚至需要更大的滤波器核来最小化伪影。请注意,在极限情况下,滤波器大小与图像本身一样大。在那种情况下,局部运算符变成了全局运算符,并且通常通过局部方法实现的额外压缩将丢失。

采用每个像素除以相同位置的高斯模糊像素的功能形式因此需要在压缩量和伪影严重性之间做出不理想的折衷。

20.9 Sigmoda 函数

方程(20.3)采用与简单除法不同的函数形式,因此提供了不同的压缩量、伪影存在性和计算速度之间的权衡。

Sigmoda 函数具有几个理想的特性。对于非常小的亮度值,映射近似为线性,以便在图像的暗区保留对比度。该函数在 1 处具有渐近线,这意味着输出映射始终在 0011 之间受限。

在公式(20.3)中,可以将函数 f(x,y)f(x,y) 计算为全局常量或空间变化函数。按照电生理学的通常做法,我们称 f(x,y)f(x,y) 为半饱和常数。其值确定进行色调映射后哪些输入图像值是最佳可见的。特别是,如果我们假设指数 nn 等于 11,则与半饱和常数相等的亮度值将被映射到 0.50.5。选择不同的半饱和常数的效果如图 20.21 所示。

fig11_1.jpg

图 20.21。选择半饱和常数确定输入值映射到显示值的方式。

函数 f(x,y)f(x,y) 可以通过多种不同的方式计算(Reinhard 等人,2005)。在其最简单的形式中,将 f(x,y) 设置为 Lˉv/k\bar{L}_{v}/k,以便将几何平均值映射到用户参数 kk(图 20.22)(Reinhard 等人,2002)。在这种情况下,kk 的一个很好的初始值是 0.18,尽管对于特别明亮或特别暗的场景,这个值可能会上升或下降。它的值可以从图像本身估计出来(Reinhard,2003)。方程(20.3)中的指数 nn 可以设置为 11

fig11_1.jpg

图 20.22。线性缩放的图像(左)和使用 sigmoda 压缩的图像(右)。

在这种方法中,半饱和常数是几何平均值的函数,因此运算符是全局的。这个全局运算符的变体通过在线性插值几何平均值和每个像素亮度之间来计算半饱和常数:

f(x,y)=aLv(x,y)+(1a)Lˉv\begin{array}{c} f(x, y)=a L_{v}(x, y)+(1-a) \bar{L}_{v} \end{array}

插值由用户参数 a 控制,该参数影响可显示图像中对比度的变化(图 20.23)(Reinhard&Devlin,2005)。更多对比度意味着在亮和暗区域中更少的可见细节,反之亦然。这种插值可以视为一个全局运算符和一个完全局部运算符之间的中间状态,通过在两个极端之间插值而不需要进行昂贵的模糊操作。

fig11_1.jpg

图 20.23。线性插值改变了色调映射图像中的对比度。左侧图像中参数 aa 设置为 0.00.0,右侧图像中参数 aa 设置为 1.01.0

虽然运算符通常压缩亮度值,但是这个特定的运算符可以扩展以包括简单形式的色彩适应。因此,它提供了调整通常与色调映射相关联的饱和度水平的机会,如本章开头所讨论的。

与其仅压缩亮度通道,sigmoidal 压缩被应用于三个颜色通道中的每一个:

Ir,d(x,y)=Ir(x,y)Ir(x,y)+fn(x,y)Ig,d(x,y)=Ig(x,y)Ig(x,y)+fn(x,y),Ib,d(x,y)=Ib(x,y)Ib(x,y)+fn(x,y).\begin{aligned} I_{r, d}(x, y) & =\frac{I_{r}(x, y)}{I_{r}(x, y)+f^{n}(x, y)} \\ I_{g, d}(x, y) & =\frac{I_{g}(x, y)}{I_{g}(x, y)+f^{n}(x, y)}, \\ I_{b, d}(x, y) & =\frac{I_{b}(x, y)}{I_{b}(x, y)+f^{n}(x, y)} . \end{aligned}

f(x,y)f(x,y) 的计算也进行了修改,使其在几何平均亮度和像素亮度以及每个独立颜色通道和像素亮度值之间进行双线性插值。因此,我们计算几何平均亮度值 Lˉv\bar{L}_{v},以及红、绿、蓝三个通道的几何平均值(Iˉrb\bar{I}_{rb}Iˉg\bar{I}_{g}Iˉb\bar{I}_{b})。从这些值中,我们独立地为每个像素和每个颜色通道计算 f(x,y)f(x,y)。我们展示红色通道的方程(fr(x,y)f_r(x,y)):

Gr(x,y)=cIr(x,y)+(1c)Lv(x,y)Gˉr(x,y)=cIˉr+(1c)Lˉvfr(x,y)=aGr(x,y)+(1a)Gˉr(x,y)\begin{aligned} G_{r}(x, y) & =c I_{r}(x, y)+(1-c) L_{v}(x, y) \\ \bar{G}_{r}(x, y) & =c \bar{I}_{r}+(1-c) \bar{L}_{v} \\ f_{r}(x, y) & =a G_{r}(x, y)+(1-a) \bar{G}_{r}(x, y) \end{aligned}

插值参数 aa 如前所述控制对比度的数量,新插值参数 cc 允许进行简单的颜色校正(图 20.24)。

fig11_1.jpg

图 20.24。用于颜色校正的线性插值。左侧图像中参数 cc 设置为 0.00.0,右侧图像中参数 cc 设置为 1.01.0

到目前为止,我们还没有讨论方程(20.3)中指数 nn 的价值。电生理学研究报告 n=0.2n = 0.2n=0.9n = 0.9 之间的值(Hood,Finkelstein 和 Buckingham,1979)。虽然指数可以由用户指定,但是对于各种各样的图像,我们可以使用以下经验公式从几何平均亮度 Lˉv\bar{L}_{v}、图像中的最小和最大亮度(LminL_{min}LmaxL_{max})估计合理值:

n=0.3+0.7(LmaxLˉvLmaxLmin)1.4n=0.3+0.7\left(\frac{L_{\max }-\bar{L}_{v}}{L_{\max }-L_{\min }}\right)^{1.4}

到目前为止所示的 sigmoidal 压缩的几个变体都具有全局特性。这具有计算速度快的优点,并且非常适合介质至高动态范围的图像。对于非常高的动态范围图像,可能需要使用局部运算符,因为这可能会提供一些额外的压缩。将 sigmoidal 压缩扩展的一种简单方法是通过时空变化的函数替换全局半饱和常数,该函数可以通过多种不同的方式计算。

换句话说,到目前为止假定函数 f(x,y)f(x,y) 是常量,但也可以计算为空间局部平均值。实现这一点的可能最简单的方法是再次使用高斯模糊图像。模糊图像中的每个像素表示本地平均值,可以视为半饱和常数的合适选择 [1]。

[1] 虽然 f(x,y)f(x,y) 现在不再是常数,但我们继续将其称为半饱和常数。

与在前一节中讨论的基于除法的运算符一样,我们必须考虑光晕伪影。然而,当图像被其自身的高斯模糊版本除时,需要使高斯滤波器核的大小变大,以便最小化光晕。如果在具有空间变异的半饱和常数的情况下使用 sigmoids,则需要使高斯滤波器核变小,以便最小化伪影。这是一个重大的改进,因为可以直接在空间域中有效地计算少量的高斯模糊。换句话说,无需求助于昂贵的傅里叶变换。实际上,只需几个像素宽度的滤波器核就足以抑制显着的伪影,同时在色调映射图像中产生更多的局部对比度。

高斯模糊的一个潜在问题是,滤波器以与模糊小细节相同的方式模糊了锐利对比边缘。实际上,如果在考虑点周围有大的对比度梯度,则这会导致高斯模糊像素与像素本身显著不同。这是光晕的直接原因。通过在除法方法中使用非常大的滤波器核,可以平均掉这样的大对比度。

在 sigmoidal 压缩方案中,小的高斯滤波器最小化了与急剧对比度梯度重叠的可能性。在这种情况下,仍然会出现光晕,但它们的大小通常很小,人们通常会认为它们增强了对比度。

另一种模糊图像的方法,同时最小化附近大的对比度步长的负面影响,是避免在这些边缘上进行模糊。一种简单但计算代价昂贵的方法是,使用不同内核大小的高斯模糊图像堆栈进行计算。对于每个像素,我们可以选择最大的高斯核,而不会与重要梯度重叠。

在相对均匀的邻域中,高斯模糊像素的值应该是相同的,无论滤波器核的大小如何。因此,使用两个不同的高斯函数过滤的像素之间的差异应该近似为零。如果更宽的滤波器核与包含锐利对比度步长的邻域重叠,则这种差异仅会显着变化,而较小的滤波器核则不会。

因此,可以通过检查不同内核大小的高斯差异来找到不包含锐利边缘的像素周围的最大邻域。图 20.25 所示的图像中,每个像素选择的尺度如图 20.26(左侧)所示。这样的比例选择机制被摄影色调再现运算符(Reinhard 等人,2002)以及 Ashikhmin 运算符(Ashikhmin,2002)使用。

fig11_1.jpg

图 20.25。用于演示图 20.26 所示的尺度选择机制的示例图像。

fig11_1.jpg

图 20.26。尺度选择机制:左侧图像显示了在图 20.25 中显示的图像的每个像素选择的比例;像素越暗,比例越小。此图像使用了八个不同的比例进行计算。右侧图像显示了基于邻域选择机制计算的每个像素的局部平均值。

一旦了解了每个像素的适当邻域,就可以使用该邻域(如图 20.26 右侧所示)的高斯模糊平均值 LblurL_{blur} 来引导半饱和常数,例如由摄影色调再现运算符使用的方式:

Ld=Lw1+Lblur.L_{\mathrm{d}}=\frac{L_{\mathrm{w}}}{1+L_{\mathrm{blur}}} .

另一种,可能更好的方法是使用保边平滑算子,这些算子专门设计用于去除小细节,同时保持锐利对比度。几种这样的滤波器,例如双边滤波器(图 20.27),三边滤波器,Susan 滤波器,LCIS 算法和均值漂移算法都是合适的,尽管其中一些计算成本很高(Durand&Dorsey,2002; Choudhury&Tumblin,2003; Pattanaik&Yee,2002; Tumblin&Turk,1999; Comaniciu&Meer,2002)。

fig11_1.jpg

图 20.27。sigmoidal 压缩(左侧)和使用双边滤波器计算半饱和常数的 sigmoidal 压缩(右侧)。请注意,右侧图像中天空的对比度有所提高。

20.10 其他方法

虽然前面的几节总结了大多数目前的色调再现运算符,但还有一两个运算符无法直接归入上述类别。其中最简单的是对数压缩的变体,另一个是基于直方图的方法。

如果要求出的数字大于 11,则可以通过取对数来完成动态范围缩小。然后可以使用以下方程将任何正数非线性缩放在 0011 之间:

Ld(x,y)=logb(1+Lv(x,y))logb(1+Lmax)L_{d}(x, y)=\frac{\log _{b}\left(1+L_{v}(x, y)\right)}{\log _{b}\left(1+L_{\max }\right)}

虽然上面对数的基数 b 未指定,但任何基数都可以。可以利用选择对数基数的自由度随着输入亮度而变化,并因此实现更适合被压缩的图像的运算符(Drago,Myszkowski,Annen 和 Chiba,2003)。该方法使用了 Perlin 和 Hoffert 的偏置函数,该函数采用用户参数 p(Perlin&Hoffert,1989):

biasp(x)=xlog10(p)/log10(1/2)\operatorname{bias}_{p}(x)=x^{\log _{10}(p) / \log _{10}(1 / 2)}

使基数 bb 依赖于亮度并在 221010 之间平滑插值基数,可以改进上述对数映射:

Ld(x,y)=log10(1+Lv(x,y))log10(1+Lmax)1log10(2+8((Lv(x,y)Lmax)log10(p)/log10(1/2)))L_{d}(x, y)=\frac{\log _{10}\left(1+L_{v}(x, y)\right)}{\log _{10}\left(1+L_{\max }\right)} \cdot \frac{1}{\log _{10}\left(2+8\left(\left(\frac{L_{v}(x, y)}{L_{\max }}\right)^{\log _{10}(p) / \log _{10}(1 / 2)}\right)\right)}

对于用户参数 pp,初始值约为 0.850.85 会产生合理的结果(图 20.28(右))

fig11_1.jpg

图 20.28。使用基数为 10 的对数压缩(左侧)和具有不同基数的对数压缩(右侧)。

另一种选择是基于直方图均衡化的色调再现方法。传统的直方图均衡化旨在使输出图像中每个亮度值具有相等的出现概率。Greg Ward 通过一种保持对比度的方式来完善这种方法(Ward Larson,Rushmeier 和 Piatko,1997)。

首先,从高动态范围图像的亮度计算直方图。从该直方图中,计算一个累积直方图,以便每个 bin 包含具有小于或等于 bin 所代表的亮度值的像素数量。累积直方图是单调递增的函数。因此,将每个 bin 中的值绘制为它们代表的亮度值会产生可以视为亮度映射函数的函数。将此函数缩放,使其垂直轴跨越显示设备的范围,则会产生一个色调再现运算符。这种技术被称为直方图均衡化。

Ward 通过确保该函数的梯度永远不超过 1 进一步完善了该方法。这意味着,如果累积直方图中相邻值之间的差异太大,则将该差异钳制为 1。这避免了输入中亮度的微小变化可能导致输出图像中的大差异的问题。换句话说,通过限制累积直方图的梯度为 1,对比度永远不会被夸大。得到的算法称为直方图调整(见图 20.29)。

fig11_1.jpg

图 20.29。线性缩放的图像(左侧)和直方图调整的图像(右侧)。该图像在获得 Albin Polasek 博物馆 Winter Park,Florida 的友好许可下创建。

20.11 夜间色调映射

到目前为止,几乎所有讨论的色调再现运算符都假定图像代表光学观察条件下的场景,即,在正常光照条件下所见。对于暗视觉场景,即非常暗的场景,人类视觉系统表现出明显不同的行为。特别地,感知对比度较低,视力锐度(即我们可以区分的最小细节)较低,并且所有物体都呈现出略微的蓝色外观。

为了在处于光学观察条件下的监视器上正确查看这样的图像,我们可以预处理图像,以使其看起来好像我们适应了非常暗的观看环境。这种预处理通常采取减少亮度和对比度,降低图像的饱和度,蓝移和降低视力锐度(Thompson,Shirley 和 Ferwerda,2002)的形式。

一种典型的方法是首先将图像从 RGBRGB 转换为 XYZXYZ。然后,可以为每个像素计算暗视觉亮度 VV

V=Y[1.33(1+Y+ZX)1.68]V=Y\left[1.33\left(1+\frac{Y+Z}{X}\right)-1.68\right]

然后可以缩放这个单通道图像并将其乘以经验选择的蓝灰色。如图 20.30 所示的示例。如果某些像素处于光学范围内,则可以通过线性混合蓝灰色图像和输入图像来创建夜间图像。要使用的每个像素的分数取决于 VV

fig11_1.jpg

图 20.30。使用图 20.12 中显示的图像模拟夜间场景。

通过低通滤波夜间图像可以模拟视力锐度下降,尽管这会给人一种错误的模糊感。更好的方法是应用双边滤波器,以保留锐利的边缘并模糊较小的细节(Tomasi&Manduchi,1998)。

最后,在第 20.3 节中概述的颜色转换技术也可以用于将白天图像转换为夜间场景。此方法的有效性取决于是否有适合从中传输颜色的夜间图像。例如,图 20.12 中的图像被转换成图 20.31 中的夜间图像。

fig11_1.jpg

20.12 讨论

由于全局照明算法自然产生高动态范围图像,因此无法直接显示所得到的图像。与其采用线性缩放或钳位,应该使用色调再现运算符。任何色调再现运算符都比不使用色调再现运算符好。根据应用程序的要求,可能有几个运算符适合使用。

例如,实时渲染应用程序可能应该采用简单的 S 型压缩,因为这些压缩速度足够快,可以实时运行。此外,它们的视觉质量通常也足够好。直方图调整技术(Ward Larson 等,1997)也可能足够快,以进行实时操作。

对于包含非常高动态范围的场景,可以使用本地运算符来获得更好的压缩效果。然而,计算成本通常大大提高,因此这些运算符仅适用于非交互式应用程序。由于该技术所提供的优化,双边滤波器是最快的本地运算符之一(Durand&Dorsey,2002)。

该滤波器本身作为色调再现运算符是很有趣的,也可以用于计算适用于 S 型压缩函数的局部自适应水平。在任何一种情况下,该滤波器尊重锐利的对比度变化,并平滑较小的对比度变化。这是一个重要的特征,有助于最小化环状伪影,这是本地运算符的常见问题。

减少环状伪影的另一种替代方法是摄影色调再现运算符中使用的尺度选择机制(Reinhard 等,2002),尽管此技术计算速度较慢。

总之,虽然当前提供了大量色调再现运算符,但基本上只有少数不同的方法。傅立叶域和梯度域运算符都根源于图像形成的知识。空间域运算符要么是空间变体(本地)的,要么是全局性质。这些运算符通常是基于研究人类视觉系统(以及许多其他物种的视觉系统)获得的见解。

本文作者:青波

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!