Python 柏林的噪音看起来太吵了

Python 柏林的噪音看起来太吵了,python,graphics,noise,perlin-noise,Python,Graphics,Noise,Perlin Noise,我已经编写了自己的perlin库,还使用了一个标准python库来生成噪音。以下是我的代码: import sys from noise import pnoise2, snoise2 perlin = np.empty((sizeOfImage,sizeOfImage),dtype=np.float32) freq = 1024 for y in range(256): for x in range(256): perlin[y][x] = int(pnoise2(x

我已经编写了自己的perlin库,还使用了一个标准python库来生成噪音。以下是我的代码:

import sys
from noise import pnoise2, snoise2

perlin = np.empty((sizeOfImage,sizeOfImage),dtype=np.float32)
freq = 1024
for y in range(256):
    for x in range(256):
        perlin[y][x] = int(pnoise2(x / freq, y / freq, 4) * 32.0 + 128.0)
max = np.amax(perlin)
min = np.amin(perlin)
max += abs(min)
perlin += abs(min)
perlin /= max
perlin *= 255
img = Image.fromarray(perlin, 'L')
img.save('my.png')
dp(filename='my.png')
它生成的图像是:


无论是频率还是八度音阶,它看起来总是坚韧不拔的。我的结论是,我这样使用它是错误的,但我不确定为什么我的解决方案是错误的。我通过频率使用分数单位,并在2d数组中迭代。我试过切换指示符号什么的,但似乎还是没有连续性。我怎样才能获得平滑的柏林噪声?

我认为存在一些潜在问题

  • 在对范围进行归一化之前,不要转换为
    int
    ,除非您想失去精度
  • 要正常化,从
    max
    perlin
    中减去
    min
    ,而不是添加
    abs(min)
例如:

import numpy as np
from PIL import Image
import sys
from noise import pnoise2, snoise2

sizeOfImage = 256

perlin = np.empty((sizeOfImage,sizeOfImage),dtype=np.float32)
freq = 1024
for y in range(256):
    for x in range(256):
        perlin[y][x] = pnoise2(x / freq, y / freq, 4) # don't need to scale or shift here as the code below undoes that anyway
max = np.amax(perlin)
min = np.amin(perlin)
max -= min
perlin -= min
perlin /= max
perlin *= 255
img = Image.fromarray(perlin.astype('uint8'), 'L') # convert to int here instead
img.save('my.png')

这是Python2.x吗?如果是这样的话,
x/freq
使用整数除法,并将循环中的所有值舍入为零这是python 3我觉得将min转换为abs绝对是我出错的地方。谢谢你的帮助!