分型噪声
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Perlin噪声[编辑]
Perlin噪声(Perlin noise)指由Ken Perlin发明的自然噪声生成算法[1]。由于Perlin本人的失误,Perlin噪声这个名词现在被同时用于指代两种有一定联系的的噪声生成算法。这两种算法都广泛地应用于计算机图形学,因此人们对这两种算法的称呼存在一定误解。下文中的Simplex噪声和分形噪声都曾在严肃学术论文中被单独的称作Perlin噪声。
本文仅讨论灰度图的情况。对于彩色图像的噪声生成,只要将同样的方法分别应用于各个颜色分量上,再加以合成即可。
目录
[隐藏]
∙ 1 Simplex噪声
o 1.1 经典Perlin噪声
o 1.2 经典Perlin噪声的软件实现
o 1.3 Simplex噪声
o 1.4 Simplex噪声和经典Perlin噪声的应用
∙ 2 分形噪声
o 2.1 一维分形噪声
o 2.2 二维分形噪声
∙ 3 参考文献
∙ 4 外部连接
Simplex噪声[编辑]
生成噪声最通常的想法是为每个像素赋予一个随机的灰度值。如此产生的图像如下图左。
∙
使用随机方法产生的白噪声
∙
左图的频谱
∙
对随机噪声进行柔化
∙
左图的频谱
用随机法产生的噪声图像和显然自然界物体的随机噪声有很大差别,不够真实。1985年Ken Perlin指出[1],一个理想的噪声应该具有以下性质:
1. 对旋转具有统计不变性;
2. 能量在频谱上集中于一个窄带,即:图像是连续的,高频分量受限;
3. 对变换具有统计不变性。
对于计算机图形学中的普遍应用,噪声应该是伪随机的,两次调用应得到同样的结果。
上图的噪声之所以不够真实是因为它的能量在频谱中平均分布,即它是白噪声。对白噪声进行柔化处理后限制了噪声的频谱,比之前者和自然界中的噪声现象更加接近,但是依然不能令人满意。
经典Perlin噪声[编辑]
Perlin在上述文章中提出了一种产生符合要求的一维噪声函数的简单方法,这是后续工作的基础:
1. 在一维坐标轴上,选择等距的无穷个点,将值空间划分为等长的线段(为方便起见,
选择坐标值为整数的点),为每个点随机指定一个值和一个梯度(在一维的情况,梯度就是斜率);
2. 对于坐标值为整数的点,将该点对应的值作为噪声图像上该点的值;对于坐标值不
为整数的点,将相邻两点的值和根据梯度进行插值运算,获得该点的灰度。
插值使用的函数是一个在0处为1,在1处为0,在0.5处为0.5的连续单调减函数。例如,设为左右两整数点的颜色,为该点距离左边点的距离,使用作为插值函数,则该点的值为。
是线性插值,得到的结果人工痕迹严重,且在整数点上不连续。Perlin建议使
用作为插值函数[1],后来又建议使用作为插值函数[2]。对于二维的情况,可以将上述算法进行推广,即:
1. 为所有坐标为且都是整数的点指定一个值,同时指定一个梯度,这些
点将空间分成方格;
2. 对于坐标轴为整数的点,即上述方格的顶点,将为它指定的值作为该点的值;对于
某个方格内部的点,用所在方格四个顶点的值和梯度进行插值。
例如,对于点,令它所在方格的四个顶点分别为:、、、。令,这四个顶点对点的贡献可以用它们的梯度()和点与这四个顶点的方向(、、、)进行点积获得。但是在二维的情况下,插值更为复杂。首先需要对和两点在方向插值,得到点的值;之后对和两点在x方向插值,得到
点的值;最后对和在y 方向插值,得到的值。在三维的情况下,需要进行七次插值。可以证明,插值次数随着维数的增长指数增长。
经典Perlin噪声基本满足Perlin提出的噪声条件。但是由于导数中含有线性分
量,在计算相邻点差时会体现出人工效果,不够自然。经典Perlin噪声在进行下文的分形和运算后效果不够自然[2]。
经典Perlin噪声的软件实现[编辑]
为了达到伪随机性,经典Perlin噪声(和随后的Simplex噪声)通过在一个转置数组中查询点的坐标求每个点的梯度,而不使用随机数发生器。这样两次调用可以获得同样的结果,达到伪随机性。理论上转置数组可以任意指定,但是后续的实现都使用Perlin最初提出的数组:
unsigned char perm[256]={151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,24 0,21,10,23,
190,
6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,1 77,33,
88,237,149,56,87,174,20,125,136,171,168,
68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46, 245,40,244,
102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,
89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186,
3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182 ,189,28,42,
223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,
129,22,39,253,19,98,108,110,79,113,224,232,178,185,
112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241,
81,51,145,235,249,14,239,107,
49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,1 56,180};
在生成梯度时,理论上应该任意生成一个长度为1的向量。在实现中,一维的情况下可以在这16个整数中任选
一个作为斜率,这样可以方便的通过对坐标值进行位操作实现。二维的情况下,梯度可以从
这8个向量之中随机选择一个。这8个向量具有相同的长度,因此点积后的归一化计算可以省