如何在坐标中使用Python的Noise 1.1.1?
我查了一下,发现大多数人用它来处理纹理,但我现在卡住了,想弄明白怎么把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
,然后把得到的坐标四舍五入到最近的邻居,我们就能从左边的图像变成右边的图像:
下面是获取这个图像的完整代码。系数 n1
和 n2
是用来得到一个“更不无聊”的图像。
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])
当然,这只是柏林噪声用法的冰山一角。再举个例子,给定一个特定的函数,你可以对输入进行“加噪”,然后结合前面提到的系数,来生成不同的输出。例如,下面是对一个基于余弦的函数进行处理后的结果: