快速图像伽马校正

Fast image gamma correction

我正在对尺寸为 5000x3000x3 的图像进行伽玛校正。

公式为

value ^ (1 / gamma)

对于从 0.0 到 1.0 的 RGB 值

我的输入 gamma 值范围从 0.0 到 10.0,而 gamma = 0.0 总是输出 0.0。

麻烦的是涉及的pow计算太慢了。

在 float[ ,] 上执行此操作大约需要 1300 毫秒:

for (int y = 0; y < 3000; y++)
{
    for (int x = 0; x < 5000; x++)
    {
        for (int z = 0; z < 3; z++)
        {
            arr[x, y, z] = (float)Math.Pow(arr[x, y, z], 0.3);
        }
    }
}

并且在 FloatMatrix 上使用 NMathFunctions.Pow 这需要大约 1100 毫秒:

a = NMathFunctions.Pow(a, 0.3f);

知道如何加快速度吗?

编辑:实际上,如果幂小于 1,我不确定这是否有效。我知道当你想替换 pow(x, 2.2).当功率更高时效果更好,但功率小于 1

时可能效果不佳

的确,pow 是一个非常慢的函数,甚至比 sqrt 还慢(这是有道理的,因为任何 sqrt 操作都可以用pow 使用分数作为指数)

没有办法更有效地精确计算功率,但是有很好的方法可以估计它。

一个条件是您的基值在 [0, 1] 范围内,这在您的情况下是正确的。然后你可以得到一个很好的估计(准确率在 99% 左右)。以下是您的操作方法:

使用您自己计算的离散幂的组合,而不是使用 pow。例如 x 在 [0, 1],

范围内

而不是

result = pow(x, 2.2)

result = 0.8*x*x + 0.2*x*x*x

请注意,当 x 为 0 和 x 为 1 时(结果分别为 0 和 1),它是完全准确的

我希望这对你有用