Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 伽马校正到底需要什么?_Image Processing_Brightness_Gamma_Luminance - Fatal编程技术网

Image processing 伽马校正到底需要什么?

Image processing 伽马校正到底需要什么?,image-processing,brightness,gamma,luminance,Image Processing,Brightness,Gamma,Luminance,我很难完全理解伽马校正的必要性。我希望你们能帮助我 假设我们要显示256个相邻像素。这些像素应该是从黑色到白色的平滑渐变。为了表示它们的颜色,我们使用0..255中的线性灰度值。由于人眼的非线性,监视器不能仅将这些值转换为线性亮度值。如果相邻像素的亮度值(1/256)*I_max,(2/256)*I_max,等等,我们会在较暗的区域发现两个像素之间的亮度差异过大(梯度不会平滑) 幸运的是,监视器与人眼具有相互的非线性。这意味着,如果我们将线性灰度值0..255放入帧缓冲区,那么监视器将它们转换为

我很难完全理解伽马校正的必要性。我希望你们能帮助我

假设我们要显示256个相邻像素。这些像素应该是从黑色到白色的平滑渐变。为了表示它们的颜色,我们使用
0..255中的线性灰度值。
由于人眼的非线性,监视器不能仅将这些值转换为线性亮度值。如果相邻像素的亮度值
(1/256)*I_max,(2/256)*I_max,等等
,我们会在较暗的区域发现两个像素之间的亮度差异过大(梯度不会平滑)

幸运的是,监视器与人眼具有相互的非线性。这意味着,如果我们将线性灰度值
0..255
放入帧缓冲区,那么监视器将它们转换为非线性亮度值x^gamma。然而,由于我们的眼睛是非线性的,反过来,我们感觉到一个平滑的线性梯度。显示器的非线性和我们眼睛的非线性相互抵消

那么,为什么我们需要伽马校正呢?我在书中读到,我们总是希望显示器产生线性亮度值。根据他们的说法,在将灰度值写入帧缓冲器之前,必须对监视器的非线性进行补偿。这是通过伽马校正完成的。然而,我这里的问题是——据我所知——当显示器产生线性亮度值时,我们无法感知线性亮度值(即,我们无法感知平滑、稳定的梯度)

在我看来,如果我们把线性灰度值放入帧缓冲区,那就太完美了。监视器将这些值转换为非线性亮度值,我们的眼睛再次感知线性亮度值,因为眼睛是反向非线性的。不需要对帧缓冲区中的灰度值进行伽马校正,也不需要强制监视器生成线性亮度值

我看待这些事情的方式有什么问题?
谢谢

问题实际上是在进行颜色计算时。例如,如果要混合两种颜色,则需要使用线性强度进行计算。要实际显示正确的结果,则必须将线性强度转换回gamma校正强度


你的眼睛如何感知强度是不相关的。为了正确地进行颜色计算,必须根据光学的物理原理进行计算,光学原理依赖于线性亮度值。计算颜色后,您希望显示器输出这些亮度值,而不管它是如何感知的,因此,你必须补偿显示器不能直接产生你想要的颜色这一事实。

要真正回答你看待这个问题的方式有误的问题,它没有什么真正的问题。有一个线性帧缓冲区会很好,但正如你所说,有一个8位线性帧缓冲区肯定不是很好

事实上,8位非常容易处理,这几乎是gamma压缩帧缓冲区和颜色符号的唯一理由(想想HTML的#888-将#333用于中灰色而不是#888不是不酷的)


关于监视器-您希望能够预测它对您的输入的响应,并从sRGB知道它应该是什么。通常你只需要知道这些。有些人认为它是“正确的”,或者如果显示器产生“线性”输出,如果你补偿显示器的伽马,可以模拟输出。我建议避免这样的设置,它破坏了所有(正确且理智地)假设为标准伽马的应用程序,而有利于不破坏不协调的线性假设应用程序。不要那样做。相反,请修复应用程序或将其转储。

请允许我“复活”这个问题,因为我现在正在为类似的问题而挣扎,我想我已经找到了答案——它可能对其他人有用。或者我可能错了,有人会告诉我:)

我认为你的思维方式没有问题。问题是,如果你知道自己在做什么,你不需要一直纠正。这取决于你想要实现什么。让我们看两个不同的例子

A) 灯光模拟(又名渲染)。有一个漫反射曲面,灯光指向该曲面。然后,灯光的强度加倍

嗯。让我们看看在这种情况下现实世界会发生什么。假设一个纯漫反射表面,反射光的强度将是表面的反照率乘以入射光强度和入射光角度与法线的余弦。无论什么事实是,当入射光强度加倍时,反射光强度也会加倍。这就是为什么光传输被认为是一个线性过程。有趣的是,你不会感觉到表面亮度的两倍,因为我们的感知是非线性的(这是由所谓的史蒂文幂律模拟的)。再说一遍:在现实世界中,反射光是原来的两倍,但你感觉不到它的亮度是原来的两倍

现在,我们将如何模拟这一点?好吧,如果我们有一个表面反照率的sRGB纹理,我们需要线性化它(通过去校正它,这意味着应用2.2伽马)。既然它是线性的,我们有了光的强度,我们可以用我之前说过的公式来计算反射光的强度。因为我们处在一个线性空间中,通过将强度加倍,我们将输出加倍,就像在现实世界中一样。现在我们更正我们的结果。因此,当屏幕显示渲染图像时,它将应用gamma,因此它将具有线性响应,这意味着当我们模拟两倍于前一个功率的灯光时,屏幕发出的灯光强度将是前一个灯光强度的两倍。所以从你的眼睛里射出的光