采样与还原

转载自:http://www.fseraph.com/?p=260

说明:文章只用于自己学习分享记录,不涉及任何利益。

一直想写点对图形学基本概念的理解,因为中国高校计算机教学的问题,基本本科生4年不会有太多的代码量,这也就意味着很多东西在学校里面学的时候往往没有太多的感觉,比如图形学的基本概念,什么是像素?什么是采样与还原?什么是渲染方程?这本来应该是要牢固掌握的基础知识,但是也许很多人毕业之后用了多年商业渲染引擎也没有搞明白过。虽然靠东拼西凑,也许效果也能调出来,但是这显然不是科学的方法。而且没有正确的理论模型,就好比和大家语言不通,要跟上State of Art就比较困难了,罗素说过,人生最重要的意义之一就是满足好奇心。这篇文章就是我对采样与还原理论的一些理解。顺带谈一下图形学中像素的准确的数学模型,以及卷积在图形学中意义。

首先,渲染的目的就是我们想获得某个时刻某个相机观察下现实世界的一个2D图像表示,也就是说我们需要对现实世界进行准确的模拟,从数学角度来看,现实世界的信息量是如此之大,实际上是一个无穷维的函数,我们显然只能近似的去模拟,最可行的办法就是简化物理规则与降维,比如我们可以根据人眼的构造,物理光学定律等理论,加入时间,镜片,光源等参数定义一个N维的连续函数 f(x,y,t,u,v,.)L 。我们需要用恰当的方法对所有这些变量在某些特定点进行取值,然后用某种方法(比如遵循一些适当简化的物理光学定律)获得在这些点上的函数值。有了这些函数值(也就是很多个采样点),我们就可以推断出这个函数完整的方程,从而在任意点计算函数值。这个过程采样点的选择是需要仔细考虑的,也有很完善的理论研究,目的无非都是为了在最大化信息的获取和采样点数量上取得平衡,换句话说,最终图像的一个像素可能是从很多的采样点还原出来的,所以像素绝不是一个2D的方块。而是一个Point Sample。这篇文章我们主要关心的是从离散的采样点还原出连续函数的过程,所以下面介绍一下这里面用到的数学理论:傅立叶分析和卷积。

傅立叶分析可以让我们知道在采样还原的过程中究竟会产生多少误差,以及如何更好的进行采样与还原。通过把一个函数变换到频域空间(一般的函数是在时域空间),可以获得很多有用的信息,并且傅立叶变换还可以把几乎所有的函数分解成正弦函数叠加的形式。我们全局光烘培系统用到的Spherical Harmonics就是傅立叶变换在单位圆上的推广。可以让我们把低频(就是变化比较慢,或者说比较”糊”)光照信息用比较少SH基来表示。但是保留了大部分信息,还是很有用的。

从数学角度来说,就是时域和频域的相互变换,某些属性在时域不容易分析,但是到了频域,计算相对就变得很简单了:

从时域到频域: F(ω)=f(x)eiωxdx

从频域到时域: f(x)=12πF(ω)eiωxdω

下面一副图可以比较直观让我们看到这两个域是长什么样子的:

卷积操作可以让我们从离散的采样点,通过一个滤波器(Filter)还原出一个连续的函数,这个函数的每一个点其实就是对所有采样点的一个加权求和,Filter不同,就决定了用那些采样点来还原连续函数。举个简单的例子,如果我们操作的函数是一个时间的函数,那么某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,而这些不同时刻的输出点放在一起,就形成一个对原始函数的近似表示,这就是卷积,当然我们可以把这里的时刻T换成其他的变量,比如辐射度之类的。而对图形学来说,像素值就是这里的函数值,也就是说,某一个点的像素值,有可能是由N个采样点加权求和得到的。这就是卷积在图形学中的物理意义。从信息论的角度理解,卷积就是对信息的还原操作符。另外一个有用的特性就是:时域的卷积等于频域的相乘,在时域中两个采样点相距越远,在频域中就越近,这对分析还原过程中产生的误差(走样)很有用。

下面用一个简单的例子来说明卷积的意义:

在时域中我们采样的过程可以描述为 f(x) 与单位脉冲函数的一个相乘求和过程

Shah(x)f(x)=Tiδ(xiT)f(iT).

上面的(a)是一个原始的连续函数,经过和 Shah(x) 相乘后,变成了离散的采样点(c)

从这些离散点还原这个函数,我们就得出动卷积了,其实就是用现有的这些采样点经过某些滤波器的计算来推断出任意点的函数值。

f(x)g(x)=f(x)g(xx)dx.

也就是:

f⃗ (x)=Tf(iT)r(xiT).

其中Filter就是 r(x)=max(0,1|x|). 是一个三角滤波器,也就是上图虚线的部分。

比如如果我们手工验证 f(1.5)=T(0.5f(1T)+0.5f(2T)) ,也就是说这个三角滤波器,只是用了临近的两个采样点就可以还原出中间的函数值,当然,结果是有走样的,和原函数是不同的。那么在什么情况下,我们可以精确的还原出原函数呢?直观的讲,我们知道肯定是采样点越多越好,这样信息获得越多,最后还原出来的函数就越准确,但是究竟要以多大的频率去采样呢?奈奎斯特采样定律解决了这个问题,从理论上证明采样频率大于最大频率的两倍就可以保证完美还原了。

在时域空间的Box函数是这样定义的:

T(x)={10if|x|<Totherwise.

这个函数对应的频域空间的函数就是Sinc了

那么理想还原的频域空间方程就可以描述成:

F⃗ =(F(ω)Shah1T(ω))T(x)

注意,最后的Box是时域的滤波器。。。前面的卷积是频域的,最后的函数也是频域的

这个方程在时域空间是这样的:

f⃗ =(f(x) ShahT(x))sinc(x)

f⃗ (x)=sinc(xi)f(i)

因为Sinc是一个无限延伸的函数,也就意味着我们计算任何一个时域空间函数的值,都要把所有采样点的值用起来。这通常是不可能的,所以一般会使用有限的Filter函数,限制还原用到的采样点数量,这样会导致一些错误,但通常是可以接受的


从这个图我们也能直观的理解奈奎斯特采样定律,这个定律决定我们是否可以完美还原采样信号为原始函数,a中的原始采样信号的频率如果不够,那么就会在频域空间发生重叠,导致最后还原的函数出错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值