快速图像伽马校正
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),它是完全准确的
我希望这对你有用
我正在对尺寸为 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),它是完全准确的
我希望这对你有用