如何在坐标中使用Python的Noise 1.1.1?

2 投票
1 回答
923 浏览
提问于 2025-04-17 16:24

我查了一下,发现大多数人用它来处理纹理,但我现在卡住了,想弄明白怎么把Perlin噪声或Simplex噪声应用到一组二维坐标x和y上。

我只是想输入两个随机坐标,x和y,然后返回一个修改过的x和y,这样做可能吗?

我正在使用Python的noise库来生成这些坐标,但我觉得Perlin噪声挺复杂的,完全搞不懂它是怎么工作的。

1 个回答

2

我们可以用柏林噪声来给一组二维坐标增加一些不确定性(如果只有一对坐标,也没问题)。你可以把返回的噪声值(在[-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])

当然,这只是柏林噪声用法的冰山一角。再举个例子,给定一个特定的函数,你可以对输入进行“加噪”,然后结合前面提到的系数,来生成不同的输出。例如,下面是对一个基于余弦的函数进行处理后的结果:

enter image description here

撰写回答