伽马校正公式:是 .^(gamma) 还是 .^(1/gamma)?

50
我正在寻找一种简单的伽马校正公式,用于值在0到255之间的灰度图像。
假设我屏幕的伽马值为2.2(它是液晶屏幕,所以我可能需要用更复杂的过程来估计它,但让我们假设我的屏幕表现良好)。
以下哪个公式是正确的?
1. 修正后= 255 *(图像/255)。^ 2.2
2. 修正后= 255 *(图像/255)。^(1/2.2)
(这些都是MATLAB代码,但我希望即使不懂MATLAB的人也能理解)
我在网上查阅了很多资料,发现两种公式都被使用。我认为(2)是正确的,我的困惑是由于倾向于将“伽马值”称为实际伽马值的倒数,但我真的很希望得到知道技术的人的反馈...

2
你问得对。这一切非常令人困惑。 - v.oddou
@v.oddou 你的评论让我开心,我也支持这个观点,这真的很令人困惑!! - undefined
2个回答

42

这两个公式都被使用,一个用于对伽马值进行编码,另一个用于对伽马值进行解码。

当图像以整数强度值存储时,伽马编码可用于提高阴影值的质量。因此,要进行伽马编码,您需要使用以下公式:

encoded = ((original / 255) ^ (1 / gamma)) * 255

伽马解码用于恢复原始值,其公式为:

original = ((encoded / 255) ^ gamma) * 255

如果显示器执行伽马解码,您将希望使用第一个公式对图像数据进行编码。


3
好的,但是要小心。在您的第一个公式中,“original”是从渲染器(如光线追踪、光栅化等)中合成出来的值,并且处于线性(物理)空间中。如果“original”是照片或纹理的像素,则不需要应用任何公式,因为它们已经进行了伽马编码。如果这样做,你只会做同样的事情两次。而这就是问题所在,如果您有纹理作为渲染器的输入?您需要先通过应用公式2进行线性化,然后进行数学计算,最后再将结果进行伽马编码并储存。 - v.oddou
如何知道Logitech相机拍摄的图像使用了哪个伽马值? - Abc
1
@Abc:通常情况下,伽马值为2.2的图像适用于常规屏幕显示。一般来说,这是使用sRGB或Adobe RGB颜色空间的JPEG图像。 - Guffa

36

伽马校正可以控制图像的整体亮度。没有进行校正的图像可能看起来过于苍白或者太暗。假设一台计算机显示器具有 2.2 幂函数作为强度到电压响应曲线。这意味着,如果你向显示器发送一个消息,让某个像素点的强度等于 x,它实际上会显示出一个强度等于 x2.2 的像素点。由于发送到显示器的电压范围在 01 之间,这意味着显示出来的强度值将会比你想要的要低。这样的显示器被称为具有 2.2 的伽马值。

因此,在您的情况下,

Corrected = 255 * (Image/255)^(1/2.2).

抱歉,我不明白。在你的公式中,“Image”是什么意思?它是在0-1之间还是在0-255之间的值?结果呢?应该是在0-1之间还是在0-255之间的数字?我一直跟上了你的解释,但当涉及到公式时,你假设了我没有的一些知识。你在解释中提到了“x^2.2”(如果它在0-1之间,它将减小值),但是在公式中你使用了“(1/2.2)”,这与你从解释中设置的完全相反。这可能是我基本数学能力的缺乏,但无论如何。 - Rafael Eyng
解释我的问题:我尝试了一个具体的例子,其中Image128(如果它应该是0-255之间的值),则为255 * (128 / 255) ^ (1/2.2),结果为186.41。所以128增加而不是减少,这与您的解释相反。然后我尝试了0.5(如果它应该是0-1之间的值),结果是14.99,这更奇怪了。如果您能在答案中详细解释一下这些问题,那就太好了! - Rafael Eyng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接