Algorithm Reinhard色调映射2002

Algorithm Reinhard色调映射2002,algorithm,graphics,rendering,hdrimages,Algorithm,Graphics,Rendering,Hdrimages,我正在阅读Erik Reinhard等人的论文《数字图像的摄影色调再现》,也在这里: 有一个等式#4: “[如果]L_白色值设置为场景中的最大亮度L_max…” 还有作者的源代码和各种在线实现 我的问题是,上面的公式有一个变体,我无法理解它是如何以及从何而来的。以Luxrender源代码为例: 有一些新的变量“pre_scale”、“post_scale”和“burn”,本文没有提到。他们计算L_white(=Y_white)的方式也非常不同: const float Y_white = p

我正在阅读Erik Reinhard等人的论文《数字图像的摄影色调再现》,也在这里:

有一个等式#4:

“[如果]L_白色值设置为场景中的最大亮度L_max…”

还有作者的源代码和各种在线实现

我的问题是,上面的公式有一个变体,我无法理解它是如何以及从何而来的。以Luxrender源代码为例:

有一些新的变量“pre_scale”、“post_scale”和“burn”,本文没有提到。他们计算L_white(=Y_white)的方式也非常不同:

const float Y_white = pre_scale * alpha * burn;

请问,有人能给我解释一下如何推导出这样的算法吗?我假设它是基于这篇论文的,但我不明白…

在那篇论文中,等式(4)在“3.1初始亮度映射”一节中。这不是最终的转换。“3.2自动闪避和燃烧”部分是
burn
变量的来源;燃烧时大于1,闪避时小于1。在没有阅读代码的情况下,我假设
pre_scale
post_scale
以及它们内部任意亮度值到实际颜色空间的转换。

在那篇文章中,等式(4)在“3.1初始亮度映射”一节中。这不是最终的转换。“3.2自动闪避和燃烧”部分是
burn
变量的来源;燃烧时大于1,闪避时小于1。没有阅读代码,我会假设
pre\u scale
post\u scale
并将其内部任意亮度值转换为实际的颜色空间。

对不起,但是您在哪里看到
burn
>1
?3.2讨论了“圆对称高斯函数”和傅里叶域。但是Luxrender中的代码要简单得多。Reinhard附带的代码还包含
image[y][x][0]=image[y][x][0]*(1.+(image[y][x][0]/Lmax2))/(1.+image[y][x][0])这仍然不同于Luxrender的代码。如果您不理解burn和dodge在暗室环境中的含义,我并不奇怪这些对您来说没有意义。燃烧意味着增加亮度;回避意味着减少它。谢谢你的澄清。但是它如何解释
Y_white=pre_scale*alpha*burn
,而不是
L_white=L_max
?整篇文章都是关于如何减小亮度的动态范围。简单地最大限度地切断东西并不能很好地做到这一点。对不起,你在哪里看到
burn
>1
?3.2讨论了“圆对称高斯函数”和傅里叶域。但是Luxrender中的代码要简单得多。Reinhard附带的代码还包含
image[y][x][0]=image[y][x][0]*(1.+(image[y][x][0]/Lmax2))/(1.+image[y][x][0])这仍然不同于Luxrender的代码。如果您不理解burn和dodge在暗室环境中的含义,我并不奇怪这些对您来说没有意义。燃烧意味着增加亮度;回避意味着减少它。谢谢你的澄清。但是它如何解释
Y_white=pre_scale*alpha*burn
,而不是
L_white=L_max
?整篇文章都是关于如何减小亮度的动态范围。简单地在最大限度上切断事情并不能很好地做到这一点。
scale[i] = ( post_scale * (1.0f + lum*recip_Y_white2) / (1.0f + lum) ); //* maxDisplayY;
const float Y_white = pre_scale * alpha * burn;