正如第 19 章所讨论的,人类的视觉系统适应了广泛的观看条件。在正常观看下,我们可以分辨出大约 4 到 5 个 log 单位的照明范围,也就是说,我们可以看到细节的最亮和最暗区域之间的亮度比可能高达 100000:1。 通过适应过程,我们可以适应更大范围的光照。我们称与人类视觉系统的能力相匹配的图像为高动态范围图像。
视觉模拟通常会产生具有高动态范围的图像。图像捕捉技术的最新发展允许多次曝光对齐并重新组合成单个高动态范围图像。多重曝光技术也可用于视频。 此外,我们希望未来的硬件能够直接拍摄高动态范围的场景。一般来说,我们可以将每个像素视为浮点数的三元组。
随着创建高动态范围图像变得越来越容易,显示此类数据的需求正在迅速增加。不幸的是,大多数当前的显示设备,监视器和打印机,只能显示大约 2 个 log 单位(两个数量级)的动态范围。我们认为这种设备具有低动态范围。 目前存在的大多数图像都是用“byte-per-pixel-per-color”通道表示的,该通道与当前的显示设备相匹配,而不是与它们所代表的场景相匹配。 通常,低动态范围的图像不能在不丢失信息的情况下表现场景。 一个常见的例子是一个室内房间,通过窗户可以看到一个室外区域。人类很容易就能看到室内和室外的细节。 传统的照片通常不能捕捉到这些全方位的信息——摄影师必须选择是室内还是室外的部分被适当曝光(见图 20.1)。这些可以通过使用高动态范围成像和使用本章描述的技术来避免(见图 20.2)。 有两种策略可用于显示高动态范围图像。首先,我们可以开发可以直接适应高动态范围的显示设备。其次,我们可以准备高动态范围图像,以便在低动态范围显示设备上显示。这是目前比较常见的方法,也是本章的主题。 虽然我们预见高动态范围显示设备将在(不久的)将来得到广泛应用,但压缩图像动态范围的需求可能会减少,但不会消失。特别是,像这本书这样的印刷媒体,就其本质而言,是低动态范围的。 为了在低动态范围显示设备上显示而压缩图像值范围称为==色调映射==(Tonemapping)或==色调再现==(Tone Reproduction)。 一个简单的压缩函数是将图像归一化(图 20.3(左))。这构成了线性缩放,只有当图像的动态范围仅略高于显示设备的动态范围时,线性缩放才足够。 对于具有较高动态范围的图像,较小的强度差异将被量化为相同的显示值,从而丢失可见细节。在图 20.3(中)中,所有大于用户指定最大值的像素值都被设置为该最大值(即这些值被钳制)。这使得归一化较少依赖于噪声异常值,但这里我们在图像的明亮区域丢失了信息。 为了进行比较,图 20.3(右)是一个色调映射版本,图中显示了暗区和亮区的细节。
一般来说,线性缩放不适合色调重构。 色调重构的关键问题是在压缩图像的同时保留图像的一个或多个属性。不同的色调重构算法关注不同的属性,如对比度、可见细节、亮度或外观。
理想情况下,在低动态范围显示设备上显示色调映射图像将在观察者眼中产生与原始场景相同的视觉反应。考虑到显示设备的限制,这是不可能实现的,我们可以尽可能地接近这个目标。 作为一个例子,我们创建了如图 20.4 所示的高动态范围图像。然后将该图像进行色调映射并显示在显示设备上。然后将显示设备本身放置在场景中(图 20.5)。在理想的情况下,显示的图像应当与环境融为一体。根据色调重构算法的质量以及所描绘场景的性质,这一目标也许更容易/困难实现。
虽然可以根据它们旨在保留的属性或开发的任务对色调重构算法进行分类,但我们根据它们的一般技术对算法进行分类。这将使我们能够展示大量不同算法之间的差异和相似之处,因此,希望对色调重构任务选择合适的算法给出有意义的指导。
我们遵循的主要分类方案基于从各个学科获得的见解。特别地,一些算法是基于人类视觉感知的知识。 人类的视觉系统利用视网膜上的感光器来探测光线。光被转换成电信号,在视网膜中部分处理,然后传输到大脑。除了视网膜上最初的几层细胞外,从检测到的光中产生的信号是通过脉冲序列传输的。承载的信息量就是这些电脉冲发生的频率。
人类视觉系统所能探测到的光的范围远远大于人类大脑用来传递信息的频率范围(???)。因此,人类视觉系统毫不费力地解决了色调重构问题——大范围的亮度被转换成小范围的脉冲序列频率。因此,模拟人类视觉系统是一种有价值的色调重构方法。
第二类算法以物理学为基础。光在被光感受器吸收之前与表面和体积相互作用。在计算机图形学中,光相互作用通常由渲染方程来建模。对于纯粹漫反射表面,该方程可以简化为入射到表面上的光(照度)与该表面的反射光能力(反射率)之间的乘积。
由于反射率是表面的被动属性,因此对于漫反射表面,根据定义,反射率是低动态范围的——通常在 0.005 和 1 之间。 一个表面的反射率不能大于 1,否则它反射的光会比入射到表面的光多。另一方面,照度可以是任意大的值,并且只受光源的强度和接近程度的限制。
因此,图像的动态范围主要由照度决定。因此,对于漫射场景,一种可行的色调重构方法是将反射率与照度分离,压缩照度分量,然后重新组合图像。
然而,假设场景中的所有表面都是漫射的通常是不正确的。许多高动态范围图像描绘高光和直接可见的光源。镜面反射的亮度几乎和它反射的光源一样高。
目前使用的各种色调重构算法将图像分成高动态范围基础层和低动态范围细节层。如果所描绘的场景完全是漫射的,这些层将表示照度(光源)和反射率(被照射物体)。 对于包含直接可见光源或镜面高光的场景,划分为基础层和细节层仍然允许设计有效的色调重构算法,尽管单独的层没有直接的意义。
传统图像以每像素一个字节的方式存储红、绿、蓝三色成分。这种编码所提供的动态范围取决于最小和最大可表示值之间的比率,以及连续值之间的步长。因此,对于低动态范围的图像,每个颜色通道只有 256 个不同的值。
高动态范围图像编码可能的值则是一个明显更大的集合。最大值要大得多,且连续值之间的步长也要小得多。因此,高动态范围图像的文件大小通常也更大,例如 OpenEXR 文件。
限制文件大小的另一种方法是对高动态数据应用色调重构算法。然后可以将结果编码为 JPEG 格式。此外,输入图像可以由色调映射的图像按像素划分。然后可以对这种划分的结果进行次采样,并将其作为少量数据存储在相同的 JPEG 图像的头部(Header)中。这种子带(Sub-Band)编码图像的文件大小与传统 JPEG 编码图像的顺序相同。显示程序可以直接显示 JPEG 图像,也可以通过将色调映射的图像与存储在头部(Header)中的数据相乘来重建高动态范围图像。
一般来说,最小步长和最小可表示值与最大可表示值之比的组合决定了图像编码方案提供的动态范围。对于计算机生成的图像,在写入文件或显示在屏幕上之前,图像通常被存储为浮点值的三元组,尽管可能有更有效的编码方案。 由于大多数显示设备仍然配备 8 位 D/A 转换器,我们可以认为色调重构是浮点数到字节的映射,这样结果就可以在低动态范围显示设备上显示。
单个图像的动态范围通常较小,由场景中发现的最小和最大亮度决定。因此,测量图像的动态范围的简单方法可以计算图像的最大和最小像素值之间的比率。对异常值的敏感性可以通过忽略一小部分最暗和最亮的像素来降低。
或者,相同的比率可以表示为对数域中的差。这一措施对异常值不太敏感。注意,在这种情况下,夜景的动态范围并不比白天场景小。虽然夜景中的所有值都较小,但最大值和最小值之间的比例并非如此。
然而,记录设备或渲染算法可能会引入噪声,从而降低有用的动态范围。因此,测量图像的动态范围应考虑噪声。 更好的动态范围测量方法是信号处理中使用的以分贝表示的信噪比。
色调重构算法通常压缩亮度值,而不是直接在彩色图像的红、绿、蓝分量上工作。在这些亮度值被压缩成显示值 Ld(x, y)之后,可以通过保持颜色通道之间的比率与压缩前相同(使用 s = 1)来重建彩色图像: 结果经常出现过饱和,因为人类的色彩感知相对于整体亮度水平是非线性的。这意味着,如果我们在昏暗的环境中观看显示器上明亮的室外场景图像,我们的眼睛会适应昏暗的环境,而不是室外照明。通过保持色彩比例不变,我们便无需考虑这种影响。 或者,可以选择小于 1 的饱和常数 s。这样的单通道伽玛校正可以使结果去饱和到一个适当的水平。一个更全面的解决方案是将色彩外观建模领域的想法纳入色调重构算法。
最后,如果一个具有代表性颜色方案的示例图像已经可用,则可以将该颜色方案应用于新图像。图像之间的这种颜色映射可以用于细微的颜色校正,例如饱和度调整或用于更有创造性的颜色映射。 映射通过将源图像和目标图像转换为去相关的颜色空间来进行。在这样的色彩空间中,每个色彩通道中的像素值可以独立处理,而不会引入太多的伪影。
在去相关的色彩空间中,将颜色从一张图像映射到另一张图像是很简单的:分别计算源图像和目标图像中三个颜色通道的所有像素的平均值和标准差。然后,对目标图像进行平移和缩放,使目标图像在每个颜色通道中的均值和标准差与源图像相同。然后通过将去相关色彩空间转换为 RGB 并将负像素钳制为零来获得结果图像。 应用该算法后,图像的动态范围可能会发生变化。因此,建议将该算法应用于高动态范围图像,然后应用传统的色调重构算法。
现在,我们假设图像是由于光被表面漫反射而形成的。我们将这一限制放宽到直接描绘光源和高光的场景。每个像素点的亮度 Lv 近似为以下乘积:
对于典型的漫反射场景,由于纹理表面以及表面边缘的存在,反射率分量往往表现出高的空间频率。另一方面,照度在空间上是一个缓慢变化的函数。
由于反射率是低动态范围,而照度是高动态范围,我们可以尝试将这两个分量分开。反射率和照度的频率依赖性提供了一个解决方案。 例如,我们可以计算图像的傅里叶变换,只衰减低频。这压缩了照度分量,同时使反射率分量基本不受影响——我们所知道的第一个数字色调给出算子就采用了这种方法。 最近,其他算法也遵循了这一思路。特别是,双边和三边滤波器被用来将图像分为基础层和细节层。这两种滤波器都是保持边缘的平滑算子,可以以各种不同的方式使用。对密度图像应用边缘保持的平滑算子会导致图像模糊,其中尖锐的边缘仍然存在(图 20.14(左))。我们可以把这样的图像看作基础层。然后,如果我们将高动态范围图像按像素划分出基础层,我们就得到一个包含所有高频细节的细节层(图 20.14(右))。 对于漫射场景,基础层和细节层类似于照度和反射率的表示。对于描绘高光和光源的图像,这种类比并不成立。但是,无论图像的内容如何,都可以将图像分离为基础层和细节层。 通过在重组成压缩密度图像之前压缩基础层,可以创建低动态范围密度图像(图 20.15)。取幂后,得到可显示的图像。
边缘保持平滑算子还可用于计算每个像素的局部适应水平,该适应水平可用于空间变化或局部色调再现算法。
在前一节中为基于频率的算法所做的论证也适用于梯度场。假设没有直接可见的光源,反射率分量将是一个常数函数,在梯度场中具有尖锐的尖峰(???常值函数怎么会有梯度尖峰)。同样,照度分量也会在各处引起小的梯度。
在典型的场景中,人类通常能够区分照度和反射率。扣除光源后的表面反射率被称为亮度(Lightness)。 为了评估仅描绘漫射表面图像的亮度,B. K. P. Horn 是第一个使用梯度场分离反射率和照度的人。他使用简单的阈值去除所有小梯度,然后整合图像,这涉及到使用全多网格方法求解泊松方程。 其结果类似于保持边缘的平滑滤波器。这符合预期,因为 Oppenheim 的基于频率的算子是在相同的场景反射率和图像形成假设下工作的。 Horn 的工作不能直接用作色调重构算法,因为大多数高动态范围图像描绘光源。然而,一个相对较小的改变将使这项工作成为一个合适的色调重构算法。 如果在图像中描绘了光源或镜面,那么大的梯度将与光源和高光的边缘相关联。这些使图像具有高动态范围(亮的区域就是高动态范围的区域)。图 20.16 中斯诺克球上的高光产生了明显的梯度。 因此,我们可以通过衰减大梯度来压缩高动态范围图像,而不是对梯度场进行阈值(钳制)处理。Fattal 等人采用了这种方法,通过积分压缩的梯度场,可以成功地压缩高动态范围图像(图 20.17)。并且 Fatal 的梯度域压缩并不局限于漫射场景。
本小节,我们将讨论直接对像素进行压缩而不转换到其他域的色调重构算法。通常,全局算子和局部算子是有区别的。前一类色调重构算子根据一个对每个像素都相同的压缩函数来改变每个像素的亮度值。术语全局源于这样一个事实,即许多这样的函数(压缩函数)需要锚定到通过分析完整图像确定的某些值。在实践中,大多数算法使用几何平均值来控制压缩: $$\bar{L}v=\exp{\Big( \frac{1}{N}\sum{x,y}\log{(δ+L_v(x,y))} \Big)}$$ 上式引入一个小常数 δ 以防止在黑色像素存在时平均值变为零(log 0 无意义)。 几何平均值通常映射到预定义的显示值。将几何平均值映射到不同显示值的效果如图 20.18 所示。或者,有时使用最小或最大图像亮度。全局算子设计中面临的主要挑战在于压缩函数的选择。 另一方面,局部算子根据特定的压缩函数压缩每个像素,该压缩函数从相邻像素中获得的信息,而非整个图像。其基本原理是,我们对明亮像素之中的明亮像素和昏暗像素之中的明亮像素的感知是不同的。 开发局部算子的设计挑战包括选择压缩函数、每个像素的局部邻域大小以及使用局部像素值的方式。一般来说,局部运算符比全局运算符实现更好的压缩(图 20.19),尽管计算成本更高。
无论是全局算子还是局部算子,都常常受到人类视觉系统的启发。大多数算子使用两种不同的压缩函数的其中一个,这与局部算子和全局算子的区别是正交的(???原文是 orthogonal)。显示值 Ld(x, y)通常由图像亮度 Lv (x, y)通过以下两种函数形式导出: 在这些方程中,f (x, y)可以是一个常数,也可以是一个随像素变化的函数。 在前一种情况下,我们有一个全局算子。而使用一个随空间变化的函数 f (x, y),我们将得到一个局部算子。指数 n 通常是一个常数,对于特定的算子是固定的。
式(20.2)将每个像素的亮度除以从完整图像或局部邻域得到的值。方程(20.3)在 对数-线性 图上有一条 s 形曲线,因此被称为 Sigmoid。
每个像素可以除以一个常数,以使高动态范围图像处于可显示范围内。这种除法实质上是线性缩放。虽然图 20.3 显示了特别的线性缩放,但这种方法可以通过使用心理物理学数据来推导公式(20.2)中的缩放常数 f (x, y) = k 来改进。
另外,存在几种计算空间变化的除数的方法。在每种情况下,f (x, y)都是图像的模糊版本,即$f(x,y)=L_v^{blur}(x,y)$。模糊是通过将图像与高斯滤波器卷积来实现的。 此外,通过模糊图像计算的 f (x, y)可以与白点移位相结合,用于颜色外观建模(???)。
高斯滤波器的大小和权重对最终的可显示图像有深远的影响。高斯滤波器具有加权求局部平均值的作用。色调重构就是将每个像素除以其相关的加权局部平均值。 如果选择的过滤器核的大小太小,则会出现晕影(图 20.20(左))。晕影是局部算子的常见问题,当色调映射依赖于除法时尤其明显。 通常,在这种方法中,通过使过滤器核变大,可以最小化晕影(图 20.20(右))。通过选择至少为图像四分之一的滤波器尺寸,可以获得合理的结果。有时甚至需要更大的过滤器内核来最小化伪影。 注意,在极限情况下,过滤器的大小变得和图像本身一样大。在这种情况下,局部算子变为全局算子,而通常由局部方法提供的额外压缩将丢失。
每个像素在相同的空间位置被一个高斯模糊像素值相除,因此需要在压缩量和混叠伪影的严重程度之间进行权衡。
公式(20.3)遵循与简单除法不同的函数形式,因此,在压缩量、混叠伪影和计算速度之间提供了不同的权衡。
Sigmoids 有几个理想的性质。对于非常小的亮度值,映射近似为线性,因此在图像的暗区保留对比度。函数在 1 处有渐近线(y=1),这意味着输出映射总是在 0 和 1 之间有界。 在式(20.3)中,函数 f (x, y)可以计算为全局常数,也可以计算为随空间变化的函数。按照电生理学的惯例,我们称 f (x, y)为半饱和常数。它的值决定了在色调映射后输入图像中的哪些值是最佳可见的。特别是,如果我们假设指数 n 等于 1,那么等于半饱和常数的亮度值将被映射到 0.5。选择不同半饱和常数的效果如图 20.21 所示。 函数 f(x,y)可以用几种不同的方式计算。在其最简单的形式中,f(x,y)被设置为$\bar{L}_v / k$,使得几何平均值映射到用户参数 k(图 20.22)。 在这种情况下,k 的良好初始值是 0.18,对于特别明亮或黑暗的场景,这个值可以提高或降低。它的值也可以从图像本身来估计。等式(20.3)中的指数 n 可以设置为 1。
在这种方法中,半饱和常数是几何平均值的函数,因此该算子是全局的。一种全局算子的变体利用像素点亮度和几何均值的线性插值来计算半饱和常数: $$f(x,y)=a,L_v(x,y)+(1-a),\bar{L}v$$ 插值由用户参数 a 控制,它具有改变可显示图像对比度的效果(图 20.23)。对比度越大,明暗区域的可见细节就越少,反之亦然。 这种插值可以被看作是完全全局算子和完全局部算子之间的折衷,在两个极端之间进行插值,而不需要使用昂贵的模糊操作。 虽然算子通常压缩亮度值,这个特殊的算子可以扩展到包含一个简单形式的颜色适应。因此,它提供了一个机会来调整通常与色调映射相关的饱和度水平,如本章开头所讨论的。 不只压缩亮度通道,而是将 Sigmoid 压缩应用于三个颜色通道中的每一个: f (x, y)的计算也被修改为几何平均亮度与像素亮度之间以及每个独立颜色通道与像素亮度值之间的双线性插值。 因此,我们计算几何平均亮度值$\bar{L}v$,以及红色、绿色和蓝色通道(Ir、Ig 和 Ib)的几何平均亮度值。根据这些值,我们独立计算每个像素和每个颜色通道的 f (x, y)。我们给出了红色通道$(f_r(x,y))$的方程: 插值参数 a 像以前一样控制对比度的大小,新的插值参数 c 允许一种简单的颜色校正形式(图 20.24)。 到目前为止,我们还没有讨论式(20.3)中 n 指数的值。电生理学研究报告指出数值应当在 n = 0.2 和 n = 0.9 之间。 虽然指数可以由用户指定,但对于各种各样的图像,我们可以根据几何平均亮度 Lv 和图像中的最小和最大亮度(Lmin 和 Lmax)估计一个合理的值,经验公式如下: $$n=0.3+0.7,\Big( \frac{L{max}-\bar{L}v}{L{max}-L{min}} \Big)^{1.4}$$ 到目前为止所展示的 Sigmoid 压缩的几种变体在本质上都是全局的。这样做的优点是计算速度快,非常适合中高动态范围的图像。 对于非常高动态范围的图像,可能需要求助于局部算子,因为这可能会提供一些额外的压缩。扩展 Sigmoid 压缩的一种直接方法是用随空间变化的函数代替全局半饱和常数,该函数可以用几种不同的方法计算。
换句话说,函数 f (x, y)到目前为止被假设为常数,但也可以计算为空间局部化的平均值。 也许实现这一点的最简单的方法是再次使用高斯模糊图像。模糊图像中的每个像素代表一个局部平均值,可以将其视为半饱和常数的合适选择。
和基于除法的算子一样,我们必须考虑光晕伪影。然而,当图像被自身的高斯模糊的版本相除时,高斯滤波器核的大小需要很大,来最小化光晕伪影。如果 sigmoids 与随空间变化的半饱和常数一起使用,则高斯滤波器核需要变小来最小化伪影。 这是一个显著的改进,因为小型的高斯模糊可以在空间域中有效地直接计算(速度快)。换句话说,不需要使用昂贵的傅里叶变换。 在实践中,只有几个像素宽度的滤波器核足以抑制明显的伪影,同时在色调映射的图像中产生更多的局部对比度。
Haloing Artifacts:光晕伪影
高斯模糊的一个潜在问题是,滤镜模糊鲜明对比的边缘,就像它模糊小细节一样(高斯模糊会抹平边缘以及细小的细节)。 在实际应用中,如果所考虑的像素附近存在较大的有对比度的梯度,则会导致高斯模糊的像素与原本的像素存在显著差异。这是光晕伪影产生的直接原因。通过在基于除法的方法中使用一个非常大的过滤器核,这样大的对比度被平均掉了。
在 Sigmoid 压缩方案中,一个小的高斯滤波器可以最小化与锐利对比度梯度重叠的机会。在这种情况下,光晕仍然会出现,但它们的大小通常不会被注意到,反而被认为增强了对比度。
另一种模糊图像,同时尽量减少附近大对比度阶跃的负面影响,的方法是避免在这样的边缘模糊。一种简单但计算成本高的方法是计算具有不同核大小的高斯模糊图像的堆栈下(高斯金字塔)。对于每个像素,我们可以选择不与显著梯度重叠的最大高斯。
在一个相对均匀的邻域中,无论滤波器核大小如何,高斯模糊像素的值都应该和原图的像素值相同。因此,用两个不同的高斯函数滤波器的像素之差应该近似为零。只有当较宽的过滤器核与包含尖锐对比度阶跃的邻域重叠,而较小的过滤器核的邻域不包含时,像素之差才会发生显著变化。
因此,通过检查不同核大小的高斯分布的像素之差,可以找到像素周围不包含锐边的最大邻域。对于图 20.25 所示的图像,为每个像素选择的比例如图 20.26(左)所示。
摄影色调重构算法和 Ashikhmin 算子都采用了这种尺度选择机制。
一旦每个像素的适当邻域已知,该邻域的高斯模糊平均$L_{blur}$(图 20.26 右)可用于控制半饱和常数,例如摄影色调重构算子所使用的:
尽管前面几节一起讨论了迄今为止大多数色调重构算法,但仍有一两个算子无法直接归入上述类别。其中最简单的是对数压缩的变化,另一种是基于直方图的方法。
动态范围缩小可以通过取对数来完成,只要这个数字大于 1。任何正数都可以用以下公式非线性缩放到 0 和 1 之间:
$$\log_{a}{(b)}= \frac{\log_c(b)}{\log_c(a)}$$
虽然上面对数的底 b 没有指定,但选择任何的底都可以。这种选择对数底数的自由可以用来随输入亮度的变化改变底数,从而实现与被压缩图像更好匹配的算子。该方法使用 Perlin 和 Hoffert 的偏差函数,该函数以用户参数 p 为参数:
或者,色调重构也可以基于直方图均衡化。传统的直方图均衡化旨在使每个亮度值在输出图像中出现的概率相等。Greg Ward 以一种保持对比度的方式改进了这种方法。
首先,从高动态范围图像的亮度计算出直方图:从这个直方图中,计算一个累积直方图,使得每个分箱中包含亮度值小于或等于该分箱所表示的亮度值的像素的数目。累积直方图是一个单调递增的函数。 因此,根据每个分箱所表示的亮度值绘制每个分箱中像素的值,产生一个亮度映射函数。缩放此函数,使垂直轴跨越显示设备的范围,产生色调重构算法。这种技术被称为直方图均衡化。
例如,我有一个分箱收集亮度小于等于 100 的像素,这些像素占据总像素的 10%,那么就把图像中所有属于这个分箱的像素映射到 int(255 X 0.10)
Ward 进一步改进了这个方法,保证了这个函数的梯度不超过 1。这意味着,如果累积直方图中相邻值之间的差异太大,则该差异被限制为 1。这避免了输入亮度的微小变化可能在输出图像中产生巨大差异的问题。换句话说,通过限制累积直方图的梯度为 1,对比度不会被夸大。得到的算法称为直方图调整(见图 20.29)。
到目前为止所讨论的色调重构算法几乎都假定图像表示在感光观看条件下的场景,即在正常光照水平下看到的场景。 对于暗域场景,即非常黑暗的场景,人类视觉系统表现出明显不同的行为。特别是,感知对比度较低,视觉敏锐度(即我们能分辨的最小细节)较低,所有东西都有轻微的蓝色外观。
为了让这样的图像在放置在光照明条件下的显示器上能被正确地观看,我们可能会对图像进行预处理,使其看起来好像我们已经适应了一个非常黑暗的观看环境。这种预处理通常是:亮度和对比度降低、图像去饱和、蓝移和视觉灵敏度降低。
典型的方法是从将图像从 RGB 转换为 XYZ 开始的。然后,可以计算每个像素的暗斑亮度 V:
由于全局照明算法不可避免地产生高动态范围的图像,因此直接在低动态范围设备上显示结果图像是不可能的。我们不应该使用线性缩放或钳制,而应该使用色调重构算法。任何色调重构算法都比不使用色调重构要好。根据应用的要求,几种算子中的一种可能是合适的。
例如,实时渲染应用程序可能应该采用简单的 Sigmoid 压缩,因为这些压缩速度足够快,也可以实时运行。此外,它们的视觉质量往往也足够好。直方图调整技术也可能足够快,并进行实时操作。
对于包含非常高动态范围的场景,使用局部算子可以实现更好的压缩。然而,计算成本通常要高得多,使得这些算子只适用于非交互式应用程序。由于良好的优化,在局部算子中速度最快的是双边过滤器。
这个过滤器(双边滤波器)本身是一个有趣的色调重构算法,或者它也可以用来计算用于 Sigmoid 压缩函数的局部适应水平。在任何一种情况下,过滤器都保护尖锐的对比度变化,并对较小的对比度区域进行平滑处理。这是一个重要的功能,可以帮助最小化光晕伪影,(无法保护边缘)是局部算子的常见问题。
最小化光晕伪影的另一种方法是摄影色调重构算子中使用的尺度选择机制,尽管这种技术的计算速度较慢。
总之,虽然目前有大量的色调重构算法,但只有少数根本不同的方法存在。傅里叶域和梯度域算子都植根于图像形成的知识。空域(Spatial)算子在本质上是随空间变化(局部)或全局的。这些算子通常基于从研究人类视觉系统(以及许多其他物种的视觉系统)中获得的先验知识。