你如何使用Python的Noise 1.1.1作为坐标?

时间:2013-02-19 19:00:15

标签: python perlin-noise

我环顾四周,似乎最常用于纹理,我发现自己一直试图弄清楚如何将Perlin / Simplex Noise实现为一组二维坐标x和y。

我要做的就是输入2个随机坐标,x&然后它返回一个改变的x&是,或者这不可能?

我正在使用pythons noise来创建坐标,但我发现自己认为perlin噪声非常复杂,无法完全理解它是如何工作的。

1 个答案:

答案 0 :(得分:2)

可以使用Perlin Noise为2D坐标集合添加一些不确定性(如果集合是一对,那也很好)。您可以考虑返回的噪声值(在指向库的[-1,1]范围内)以及一些因子来确定它对输入坐标的影响程度。因子越大,噪声对数据的影响越大。这是最简单的例子之一:

from noise import snoise2 # Simplex noise for 2D points

x, y = 0.5, 0.3
factor = 0.1
n = snoise2(x, y)
print x + n * factor, y + n * factor

我们还可以考虑更大的因素,并将相同的想法应用于图像。考虑factor = 15并将生成的坐标舍入到最近的邻居,我们从左边的图像到右边的图像:

enter image description here enter image description here

以下是获取图像的完整代码。因素n1n2用于获得“不那么无聊”的图像。

import sys
from noise import snoise2
from PIL import Image

img = Image.open(sys.argv[1]).convert('L')
result = Image.new('L', img.size)
width, height = img.size

factor = 15
res = result.load()
im = img.load()
for x in xrange(width):
    for y in xrange(height):
        n1 = snoise2(x, y)
        n2 = snoise2(y, x)
        pt = [int(round(x + n1 * factor)), int(round(y + n2 * factor))]
        pt[0] = min(max(0, pt[0]), width - 1)
        pt[1] = min(max(0, pt[1]), height - 1)
        res[x, y] = im[tuple(pt)]
result.save(sys.argv[2])

当然,这甚至没有考虑如何使用Perlin Noise。作为另一个例子,给定某个函数,您可以“noisify”输入并与提到的因子结合以创建不同的输出。例如,这是基于余弦的某些函数执行此操作的结果:

enter image description here