2015-01-22 3 views
2

Я работаю над созданием шума с использованием шума Perlin и FBM, насколько я понимаю, и, похоже, у меня проблема.Perlin Noise and FBM сгенерированное изображение слишком серое

Изображения, которые я генерирую, кажутся слишком серыми, когда они предназначены для оттенков серого, но я не вижу никаких вариантов белых или черных.

Пример этого изображения (Это генерируется с использованием 8 октав)

Perlin Noise example

образом того, что я ожидал, чтобы произвести;

enter image description here

Я генерация шума следующим образом;

float result = 0.0f; 
    float amp = 1.0f; 
    float frequency = 2.0f; 

    float maxAmplitude = 0.0f; 
    int i = _octaves; 
    while (i--){ 
    result += noise(x * frequency, y * frequency, z * frequency) * amp; 
    frequency *= 2.0f; 
    maxAmplitude += amp; 
    amp *= 0.5f; 
    } 
    return result/maxAmplitude; 
    } 

где функция шума - функция улучшенного шума Ken Perlin, найденная здесь; http://mrl.nyu.edu/~perlin/noise/, и я использую таблицу перестановок по умолчанию.

Затем, когда я создаю изображения, я делаю следующее, чтобы получить изображение в оттенках серого;

ppm_image.pixel_colour[kk] = 255.0f * noise; 

Я просто интересно, как я может генерировать один и тот же высот с более широким изменением цвета (больше белых и черных, а не только узких оттенков серого).

+0

Я знаю немного о шуме Перлина, но я не уверен, что вы просите. Можете ли вы показать пример изображения того, что вы хотите по сравнению с изображением, которое вы получаете? Если вы хотите увеличить контраст между огнями и темнотой, можете ли вы выполнить пост-обработку и увеличить контраст с помощью известной техники? – eigenchris

+0

Обновлен мой вопрос. Обратите внимание, что в примере есть больше оттенков черного, мне хотелось бы что-то похожее на это. –

ответ

1

Как правило, я обнаружил, что мне нужно применить какой-то способ histogram equalization в качестве почтового процесса для данных о шуме. Это обычно работает для меня:

float min = data[0]; 
float max = data[0]; 
for (float& f : data){ 
    if(min > f) 
    min = f; 
    if(max < f) 
    max = f; 
} 
for (float& f : data){ 
    f = (f-min)/(max-min);  
}