pbrt笔记--第七章 采样与重建(一)
写在前面的总结
因第七章有点多,分两篇文章记录,本章主要简单记录下采样相关的理论。
我们现实世界中的场景的色彩是连续变化的,而我们存储的图像本质上却是一个个离散的像素组成的。相机成像的原理,是通过场景中的光打在传感器阵列上,经过采样和量化,最终形成一张图片。而在pbrt中,光线追踪算法与之类似,真实世界的ray有无数条,而投影到film平面中的辐射率也是连续变化的。但我们在真正执行渲染算法时,只能发射有限数量的ray,而在film平面上也只能用有限且离散的点来替代连续变化的数值。
本章出现许多重要概念,如采样,重建,频域,卷积,傅里叶变换,混淆等都是信号与系统,图像处理中的基本概念。书中对这些概念也有较详细的介绍,因篇幅和时间关系,本文只记录一些自己认为重要的点,若需详细了解可直接看原书或其他资料。
7.1 Sampling Theory(采样定理)
image pixels和display pixels的区别
image pixels代表的是在数字图像中某个特定采样位置的值(比如RGB格式的图像),是一种离散信号;而display pixels对应的是一种物理设备(如显示器),它发射某种分布的光谱的光,在display平面上的所有位置(而不仅仅是在image图像对应的像素点上)都有数值,是连续信号。Displays使用离散的image pixel值构建一个新的在display surface上的连续image function的过程,称为重建。
如何采样
为了得到数字image上的离散的像素值,必须要对原始的连续信号进行采样。在pbrt中,和所有其他的光线追踪渲染器一样,唯一方法就是通过tracing rays来采样film平面上的信号。我们是没有办法知道film平面上两个点之间的变化率的,我们只能通过对film平面上某个精确位置的点采样,用这些点构建一个离散的image。一个更好的方法是在不同的位置的更多的点进行采样,并把这些增加的信息也合并到最终的像素点的值上去。最好的结果是,这个计算出来的像素值能让“display设备上重建的image尽量和film平面上的原始image一样”。注意它和 “让display上的像素值和image function上对应位置的值完全相同 ”的目标是不一样的。
混淆现象(aliasing)
因为采样和重建的过程引入了近似处理,因此会有error,叫做aliasing。包括边缘的锯齿或者在画面移动时的闪烁现象。这是因为采样过程无法捕获image function上的所有信息导致的。
书中还讲了一个例子,f(x)是连续信号,f(x')是对f(x)在点x'上采样得到的离散信号(也就是图中的黑点),对f(x')的相邻的点进行线性插值,得到一个重建信号f(它也是一个连续信号)。从图中也可以看到,f没有完美的重现原始信号f(x)。
7.1.1 频域和傅里叶变换
频域和傅里叶变换在这里不再做详细记录,它们大概讲这么一回事,就是所有的信号,都可以用有限或无限个不同频率的正弦(或余弦)波叠加而成...傅里叶变换其实是时域和频域之间的桥梁,下面是傅里叶变换和反变换:
书中也举了两个例子,7.2图是时域中的两个信号,7.3是这两个信号在频域的形状,可以看到,图a在时域中变化很慢,因此它在频域中幅值大部分集中在0区域附近(也就是低频区域),而图b变化很快,它在频域中的幅值跨越了低频和高频。
本节最后介绍了一个特殊的函数:delta function 𝛿(x),狄克拉函数(我个人比较喜欢叫脉冲函数)。它的特征是:在整个定义域的积分为1,即∫𝛿(x)dx = 1,且对于所有x不等于0的地方,𝛿(x) = 0。这些特性的一个重要的结果是:
7.1.2 Ideal Sampling and Reconstruction(理想采样和重建)
采样的过程,可以看做是原函数和一个脉冲序列函数相乘,脉冲序列函数为:
T是采样周期,或者samping rate(采样速率)。相乘的结果,得到一个在等间距点上的一系列值:
这个过程如7.4图:
通过一个滤波函数r(x)和采样函数做卷积,可以得到重建函数~f:
符号圈叉的具体定义是:
对于离散信号,卷积是以采样点为中心,对采样点周围的值做加权累加的过程:
图7.5展示了一个用三角形滤波函数,对图7.1中的采样函数重建后的样子:
上面这个貌似有点复杂的过程是为了给我们一个直观的结果:重建函数~f可以通过对采样样本进行某种形式的插值得到。下面在频域的傅里叶分析可以更简单。
为了简化问题,我们假设原始函数f(x)是band limited的--也就是说存在一个频率ω0,f(x)中包含的所有频率信号都不超过ω0。比如图7.3中的两个信号,在|ω|>ω0的地方,F (ω) = 0。
傅里叶分析的一个重要的思想是:两个函数的乘积的傅里叶变换,等同于两个函数的傅里叶变换的卷积:
类似的,在空间域中的卷积,等同于在频域的乘积:
根据这个特性,在空间域中的采样,也就是原始函数f(x)和脉冲序列函数的乘积,在频域中等同于F(ω)于另一个脉冲序列函数(因为在空间域的一个脉冲序列函数,它在频域也是一个脉冲序列函数,并且他们的周期互为倒数)的卷积。
7.6图展示了F(ω)与脉冲序列函数的卷积的结果:
通过对它乘以宽度合适的矩形函数,就可以把多余的频率成分过滤掉,如图7.7,矩形函数如下:
这个乘法步骤,在空间域中对应为用一个重建滤波器和采样信号做卷积。这个过程就是理想采样和重建的过程。总结为:
把上面的过程应用在空间域中,可以准确的恢复原始信号f(x)。因为频域中的box函数的反傅里叶变换是sinc函数,在空间域中的理想重建如下:
或者
不幸的是,因为sinc函数在空间域中是无限延伸的,所以如果要计算f(x)的任何一个特定的值,都需要使用所有的f(i)的值(和sinc函数进行卷积来求f(x))。因此我们往往会选择在空间域中有限扩展的滤波器,即使不能完美的重建原始函数。
最后还说了如果使用空间域中的box函数(注意和上面说的频域中的box函数的区别),也就是把某个采样区域的所有采样值做平均处理。这样的效果会很糟糕,因为空间域中的box滤波器在频域中是sinc函数,用这个滤波器相当于在频域中对原始频谱乘以一个sinc函数,这样不仅不能很好的选择位于中间的原始频谱,而且会引入高频信号。
7.1.3 Aliasing (混叠现象)
这个长话短说吧....除了sinc函数无限延伸的问题,理想采样的重建最重要的一个问题是,它假设被采样的信号是带宽限制的。但现实中的原始信号绝大部分都是无限带宽的(也就是说原始信号的频谱是无限扩展的,有无穷高的频率成分),采样频率是不可能高于原始信号频率的。下图是采样频率小于原始信号频率的两倍时的情况,可以看到图b即使使用了sinc函数做滤波,得到的频谱和原始频谱的形状已不一样。
由比如7.9图,a图是信号f (x) = 1 + cos(4x2),b图是用一个较低的采样频率对它采样然后重建得到的重建信号,可以看到结果是惨不忍睹的....
采样定理(又名香农定理):采样信号频率需要高于原始信号频率的两倍,才能完美重建原始限号。这个最小采样频率也称为Nyquist frequency(奈比斯特频率)。
7.1.4 Antialiasing Techniques (抗混叠技术)
由采样引起的artifacts(这个不太好翻译,查了资料有些译成伪影,瑕疵,还是用原英文吧。)称为prealiasing,由重建引起的artifacts称为postaliasing。尝试修复这些errors的通常称为antialiasing。
Nonuniform Sampling(非均匀采样)
虽然image functions是无限频谱的,我们无法用高于它的采样频率采样,但是可以通过用非均匀采样(也可以说随机采样吧)来降低人类视觉对aliasing的感知。如果ξ代表一个范围从0到1的随机数,那么基于脉冲序列的非均匀采样集是:
如果采样速率不能完全捕获原始信号(也就是不满足香农定理,采样频率高于原始频率的两倍),那么无论是均匀还是非均匀采样都不能得到完全正确的信号。但是非均匀采样趋向于把这些规则的artifacts转换为噪声,这样不容易引起人类视觉系统的注意。
Adaptive Sampling (自适应采样)
长话短说...也就是如果我们能知道原始信号的某些区域的频率很高,那么我们就在那些区域增加采样个数(也就是提高采样频率)。
Prefiltering (提前滤过)
也就是说,在采样前,先把原始信号的高频信号过滤掉。当然这样看起来image会变模糊,但是模糊一般没有aliasing惹人讨厌。
图7.10中的是信号f (x) = 1 + cos(4x2)被一个box滤波器过滤后的样子,可以看到它的高频信号被干掉了(对比7.9图),这样至少在后面的采样和重建过程中没有aliasing。
7.1.5 Application to Image Synthesis
略过...
7.1.6 Source of Aliasing in Rendering(渲染中Aliasing的来源)
在渲染的image中,引起aliasing最多的是几何体。当投影到image平面后,一个物体的边界会引入一个step function(阶跃函数)--也就是image function的一个值突然变成另一个。阶跃函数不仅包含无限频谱,更糟糕的是,当完美重建器作用到这些aliased samples时,会引起Gibbs phenomenon现象。如图7.11
面对这种现象我们需要设计一个综合考虑科学,艺术以及个人口味的重建滤波器,后面章节会介绍。
书中还说了另外一些会引起aliasing的来源,暂且略过吧...
7.1.7 Understaning Pixels (理解像素)
有两点关于pixels的重要思想需要记住。首先,记住pixels是在image平面上的离散的点上的point samples,它们组成一个image;一个pixel没有“area”的概念。正如Ray Smith 强调的,把pixels当做是有限区域的方形是不对的,将会导致一系列的错误。通过在本章引入一个有关信号处理的方法的主题,我们将在一个更准确的模型上工作。
第二,在最终的image上的pixels定义在一个pixel网格的离散坐标值(x, y)上,但本章中的Samplers生成的image samples是在连续的浮点型的位置(x, y)上。基本的映射这两个域的方式是将连续的坐标round到最近的离散坐标;这种方式很吸引人,因为它把正好和离散坐标有相同值的连续坐标,映射到该离散坐标上。然而,结果是,给定一个范围为[x0, x1]的离散坐标,对应的连续坐标的覆盖范围是[x0 − 1/2, x1 + 1/2) 。因此,任何对于给定一个离散像素范围,生成连续采样点的代码,必须处理1/2的偏移。这很容易忘记,导致微妙的错误。
如果我们把连续坐标c截断为离散坐标d,通过
并且从离散转换到连续,通过
那么对于离散坐标范围为[x0, x1]的对应的连续坐标是[x0, x1 + 1) ,那么结果的代码将简单多了。如图7.12.