我目前正在使用LUT修改图像颜色的某个项目。
我的问题是我的程序没有优化......
我的程序做了什么: *打开LUT文件(.cube)并将值存储在内存中 *在图像的每个像素上,使用三线性插值来使用LUT
来改变颜色我尝试过的: *缩小图像,但这个过程仍需要很长时间......
Premiere pro或Davinci Resolve等程序如何将LUT应用于素材并以24fps读取?我的程序需要10秒才能在jpg / DNG文件上应用LUT!
答案 0 :(得分:0)
执行此操作的最有效方法是在GPU中,它可以在许多像素上同时执行许多简单的插值和查找指令。
这篇文章:https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter24.html 为您描述了算法,并且将它移植到OpenGL或其他GPU脚本语言是非常简单的:
void main(in float2 sUV : TEXCOORD0,
out half4 cOut : COLOR0,
const uniform samplerRECT imagePlane,
const uniform sampler3D lut,
const uniform float3 lutSize)
{
// get raw RGB pixel values
half3 rawColor = texRECT(imagePlane, sUV).rgb;
// calculate scale and offset values
half3 scale = (lutSize - 1.0) / lutSize;
half3 offset = 1.0 / (2.0 * lutSize);
// apply the LUT
cOut.rgb = tex3D(lut, scale * rawColor + offset);
}
除此之外,您必须使用应用程序代码将LUT作为统一阵列加载到GPU中,然后将每个视频帧流式传输到GPU,以便它可以在渲染/工作循环中将其传递到片段着色器。这很可能是专业视频编辑程序所做的,以便将LUT应用于实时视频约束。
P.S。 harold关于预先计算查找条目的评论也是加速进程的有效方法,使得操作纯粹是查找的内存访问。由于与GPU相比,CPU内存访问速度有多慢,因此它的效率仍然可能低于GPU处理的数量级,并且它的内存效率非常低,具体取决于您执行此操作的系统以及你的LUT的维度和大小。
例如,让我们说你想要完整的'用于24位RGB的3D LUT。这意味着你的最终多维数据集需要有一个大小为255的边,这意味着你的最终大小为:255 ^ 3 * 3(RGB)* 2(浮点)字节,总共接近100MB。显然,如果它只是一维LUT,这可能不是问题,或者颜色位深度较低,但是与让GPU为您处理插值相比,这种方法仍然效率低下。