快速图像伽马校正

时间:2018-02-21 10:34:38

标签: c# gamma nmath

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

公式是

  

值^(1 / gamma)

表示RGB值为0.0到1.0

我的输入伽玛值范围从0.0到10.0,而gamma = 0.0始终输出0.0。

问题在于所涉及的 pow 计算是如此缓慢。

在float [,,]:

上执行此操作大约需要1300毫秒
a = NMathFunctions.Pow(a, 0.3f);

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

getRootNode()

知道如何加快速度吗?

1 个答案:

答案 0 :(得分:1)

编辑:实际上,如果功率小于1,我不确定这是否有效。我知道当你想要替换pow(x,2.2)时它适用于伽马校正。当功率较高时,它的效果会更好,但是当功率小于1时可能效果不佳

事实上, pow 是一个非常慢的功能,甚至比 sqrt 还要慢(这是有道理的,因为任何sqrt操作都可以使用分数作为指数来完成)< / p>

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

一个条件是您的基值在[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)时,它非常准确

我希望这对你有用