如何将 Perlin 噪声值归一化到范围 [0, 1]?

How to normalize Perlin Noise Values to range [0, 1]?

我正在使用一个 numpy 数组来保存 Perlin 噪声值。有人告诉我,二维数组中的柏林噪声值分别在 [-0.7, 0.7] 范围内,但这似乎不是真的。至少在我调整八度音阶、持久性和空隙度的参数时,Caseman 的“noise”库不是这样。

我会使用不同的库,除了我找不到 python 的任何库都可以 运行 一样快。此外,无论如何,将值规范化到范围 [0, 1] 的典型公式似乎在这里不起作用。即使我得到了未修改噪声的 min/max 值,它仍然没有给我想要的值范围。我只需要猜测 min/max 值的用途,直到范围大致为 [0, 1].

如何将 Perlin 噪声值标准化到范围 [0, 1]?

import noise
import numpy
import sys

def __noise(noise_x, noise_y):
    """
    Generates and returns a noise value normalized to (roughly) range [0, 1].

    :param noise_x: The noise value of x
    :param noise_y: The noise value of y
    :return: float
    """

    value = noise.pnoise2(noise_x, noise_y, 8, 1.7, 2)
    # Normalize to range [0, 1]
    value = numpy.float32((value + 0.6447) / (0.6697 + 0.6447))

    return value


map_arr = numpy.zeros([900, 1600], numpy.float32)

for y in range(900):

    for x in range(1600):

        noise_x = x / 1600 - 0.5
        noise_y = y / 900 - 0.5

        value = __noise(noise_x, noise_y)
        map_arr[y][x] = value

for row in map_arr:
    for num in row:
        sys.stdout.write(str(num) + " ")
    print("")

map_arr = (map_arr - map_arr.min()) / (map_arr.max() - map_arr.min())(利用 numpy broadcasting 和矢量化)应该足够了。