2017-08-15 128 views
1

我已經寫了我自己的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') 

它生成的圖像是:enter image description here

無論頻率還是八度的,它看起來總是堅韌不拔。這是我的結論,因此我錯誤地使用了它,但我不確定爲什麼我的解決方案是錯誤的。我通過頻率使用小數單位並遍歷我的二維數組。我試過切換標記,但還沒有,但仍然沒有連續性。我怎樣才能獲得平穩的珀林噪音?

+0

這是Python2.x嗎?如果是這樣'x/freq'使用整數除法,並且將循環到零循環中的所有值 –

+0

這是python 3 –

回答

1

我覺得有幾個潛在的問題

  • ,除非你不想失去精度
  • 正常化,減去maxminperlin,而不是添加abs(min)的沒有轉換爲int正火範圍之前

例如:

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') 

enter image description here

+0

我覺得把min轉換成abs絕對是我出錯的地方。謝謝您的幫助! –