0

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

公式是

值 ^ (1 / 伽马)

对于 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);

知道如何加快速度吗?

4

1 回答 1

1

编辑:实际上,如果功率小于 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)

我希望这对你有用

于 2018-02-21T10:49:40.047 回答