Perlin 噪声看起来太网格化了
Perlin noise looks too griddy
我编写了自己的 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')
它生成的图像是:
无论频率或八度,它总是看起来坚韧不拔。我的结论是我因此错误地使用了它,但我不确定为什么我的解决方案是错误的。我通过频率使用小数单位并遍历我的二维数组。我尝试过切换指标等等,但似乎仍然没有连续性。如何获得平滑的柏林噪声?
我认为存在一些潜在问题
- 在标准化范围之前不要转换为
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')
我编写了自己的 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')
它生成的图像是:
无论频率或八度,它总是看起来坚韧不拔。我的结论是我因此错误地使用了它,但我不确定为什么我的解决方案是错误的。我通过频率使用小数单位并遍历我的二维数组。我尝试过切换指标等等,但似乎仍然没有连续性。如何获得平滑的柏林噪声?
我认为存在一些潜在问题
- 在标准化范围之前不要转换为
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')