Рейнхард тон-карт 2002
Я читаю статью Эрика Рейнхарда и др. называется "Воспроизведение фотографического тона для цифровых изображений", это также здесь:
http://www.cs.utah.edu/~reinhard/cdrom/
Вот это уравнение № 4:
Ld(x,y) = L(x,y)(1 + L(x,y)/L_white^2) / (1 + L(x,y))
"[Если] значение L_white установлено на максимальную яркость в сцене L_max..."
Существует также исходный код авторов и различных реализаций онлайн.
У меня вопрос, есть один вариант формулы выше, который я не могу понять, как и из чего она была получена. Посмотрите, например, на исходный код Luxrender:
http://src.luxrender.net/lux/rev/f48943145d29
scale[i] = ( post_scale * (1.0f + lum*recip_Y_white2) / (1.0f + lum) ); //* maxDisplayY;
Появились новые переменные "pre_scale", "post_scale" и "burn", которые в статье не упоминаются. Они также вычисляют L_white (= Y_white) очень по-разному:
const float Y_white = pre_scale * alpha * burn;
Пожалуйста, кто-нибудь может объяснить мне, как получить такой алгоритм? Я предполагаю, что это основано на бумаге, но я не понимаю, как...
1 ответ
В этой статье уравнение (4) находится в разделе "3.1 Начальное отображение яркости". Это не окончательное преобразование. Раздел "3.2 Автоматическое уворачивание" является источником burn
переменная; это будет> 1 для горения и < 1 для уклонения. Не прочитав код, я бы предположил, что pre_scale
а также post_scale
и преобразование их внутренних произвольных значений яркости в фактическое цветовое пространство.