不只是噪声,更是数学美 ---浅谈Perlin Noise

首先说明为什么这篇博客叫这个题目,我刚刚开始学习Perlin Noise是从知乎上的一篇文章入门的,作者的题目是不只是噪声,我觉得很有韵味,就借鉴过来。这是链接:https://zhuanlan.zhihu.com/p/22337544

一. 背景

Perlin Noise,译作柏林噪声,是指Ken Perlin发明的噪声算法。Ken Perlin早在1983年就提出了Perlin noise,当时他正在参与制作迪士尼的动画电影《电子世界争霸战》(TRON),但是他不满足于当时计算机产生的那种非常不自然的纹理效果,因此提出了Perlin噪声。随后,他在1984年的SIGGRAPH Course上做了名为Advanced Image Synthesis1的课程演讲,并在SIGGRAPH 1985上发表了他的论文[Perlin K. An image synthesizer[J]. ACM Siggraph Computer Graphics, 1985, 19(3): 287-296.](Perlin K. An image synthesizer[J]. ACM Siggraph Computer Graphics, 1985, 19(3): 287-296.)。由于Perlin噪声的算法简单,被迅速应用到各种商业软件中。后来Perlin继续研究程序纹理的生成,并和他的一名学生又在SIGGRAPH 1989上发表了一篇文章[Perlin K, Hoffert E M. Hypertexture[C]//ACM SIGGRAPH Computer Graphics. ACM, 1989, 23(3): 253-262](Perlin K, Hoffert E M. Hypertexture[C]//ACM SIGGRAPH Computer Graphics. ACM, 1989, 23(3): 253-262),提出了超级纹理(hypertexture)。他们使用噪声+fbm+ray marching实现了各种有趣的效果。到1990年,已经有大量公司在他们的产品中使用了Perlin噪声。在1999年的GDCHardCore大会上,Ken Perlin做了名为Making Noise的演讲[Perlin K. Making noise[C]//Proc. of the Game Developer Conference. 1999.](Perlin K. Making noise[C]//Proc. of the Game Developer Conference. 1999.),系统地介绍了Perlin噪声的发展、实现细节和应用。在2002年他对原有的柏林噪声算法做了改进,并发表了论文ImprovingNoise。
Prelin由于出色的工作,获得了奥斯卡科技成果奖(奥斯卡是电影业的诺贝尔奖,靠着一个算法单枪匹马获得这个奖励,Perlin确实厉害)。

二. 分类

看了很多博客,博主都没有把分形噪声和Simplex噪声归为柏林噪声。但是我觉得这样不对,因为分形噪声和Simplex都是柏林先后提出来的,所以我把这2个和原始的柏林噪声一起归为柏林噪声,在后面都做介绍。事实上,维基百科也是这样做的,将这3个噪声全部归为柏林噪声。https://zh.wikipedia.org/wiki/Perlin%E5%99%AA%E5%A3%B0
根据wiki,由程序产生噪声的方法大致可以分为两类:
类别 名称
基于晶格的方法(Lattice based) 又可细分为两种:
第一种是梯度噪声(Gradient noise),包括Perlin噪声Simplex噪声Wavelet噪声等;
第二种是Value噪声(Value noise)
基于点的方法(Point based) Worley噪声
从这个表格中,我们可以看到柏林噪声的产生是基于晶格的方法,从后面的介绍中相信一定会对”晶格”这个名字有一个深刻的理解。
下面贴出几张图片,先对这柏林噪声中的3种形式有一个直观的印象。

随机噪声

原始柏林噪声

分形噪声

Simplex噪声
从这4张图片中我们可以大概看出不同噪声的一些端倪,随机噪声就像黑白电视一样,杂乱无章。原始的柏林噪声中包含有随机的成分,但是相互之间又有关联,像素点之间是平滑的进行变化,而不是像白噪声那么尖锐。分形噪声就像我们在计算机图形学中学的分形树,简单的细节不断的重复,最后生成一个复杂的图形。
下面对白噪声,原始的柏林噪声,分形噪声,Simplex噪声的原理一一解释。

三. 白噪声

噪声的基础是随机数,如果给屏幕上的每个像素点赋予一个0和1之间的随机数来表示像素点的亮度,就会得到一幅杂乱无章的图片,就像我们小时候家里的电视在下雨天突然没有信号后屏幕上呈现的图像。从程序员的角度来看白噪声,我们无非就是引入一些随机变量到程序,给定一个输入(比如种子),程序给出一个输出。在C中,rand.h中对rand函数进行了声明,我们只要在自己的程序中引入这个头文件就行。不过这里生成的随机数是伪随机数,我们可以采用时间来作为种子。C++中也有实现了随机数的库,和C类似,毕竟是C的延伸和拓展。Python的第三方模块random对随机数的实现更加强大,因为在很多机器学习方法中需要用的随机数。U3D中通过Ramdom.Range()l来实现随机数的生成。基本的程序框架如下:(以Python为例)
import random
random.seed()
random.random()
我们从上面的代码生成随机数的过程中可以看出,这样产生的噪声非常不自然,听起来不自然,看起来也不好看。这学期学了信号与系统,不妨从信号的角度来考虑这个问题,一幅随机噪声的图像的功率谱密度在整个频域内均匀分布, 所有频率具有相同能量密度。也就是说,白噪声是指在较宽的频率范围内,各等带宽的频带所含的噪声能量相等。白噪声就像全彩色白颜色的光频。
白噪声虽然很好模拟,但是自身具有不可修复的缺点。观察现实生活中的自然噪声,它们不会长成上面这个样子。例如木头纹理、山脉起伏,它们的形状大多是趋于分形状(fractal)的,即包含了不同程度的细节。比如地形,它有起伏很大的山脉,也有起伏稍小的山丘,也有细节非常多的石子等,这些不同程度的细节共同组成了一个自然的地形表面。这些随机的成分并不是完全独立的,他们之间有一定的关联。采用微积分里面的说法,就是像素点之间变化是连续的,并没有发生跳变。很显然,白噪声没有做到这一点。

四. 原始的柏林噪声

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值