我正在对尺寸为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()
知道如何加快速度吗?
答案 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)时,它非常准确
我希望这对你有用