我目前正在使用LUTs修改图像颜色的一些项目。
我的问题是我的程序没有优化..。
我的程序所做的:*打开一个LUT文件(.cube)并将值存储在内存中*在图像的每个像素上,使用三线性插值来使用LUT改变颜色。
我试过的是:*缩小图像,但这个过程仍然需要很多时间.
像Premiere或Davinci Resolve这样的程序如何才能将LUT应用到视频中,并在24 and时读取它呢?我的程序需要10s才能在jpg/DNG文件上应用LUT!
发布于 2018-04-28 08:56:44
最有效的方法是在GPU中,它可以在许多像素上同时执行许多简单的插值和查找指令。
本文: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中,以便它能够在呈现/工作循环中通过片段着色器。这很可能是专业的视频编辑程序所做的,以应用LUTs与实时视频约束。
P.S.哈罗德关于预先计算查找条目的评论也是加快进程速度的有效方法,使操作纯粹是对查找的内存访问。它可能仍然比GPU处理效率低几个数量级,因为CPU内存访问速度比GPU慢得多,而且内存效率很低,这取决于您所使用的系统以及LUT的维度和大小。
例如,假设您想要为24位RGB制作“完整的”3D LUT。这意味着您的最终多维数据集需要大小255的边缘,这意味着您的最终大小是: 255^3 *3 (RGB) *2(浮点数)字节,总计将近100 an。显然,如果它只是一个一维LUT,这可能不是一个问题,或与较低的颜色位深度,但这种方法仍然是低效的,让GPU处理插值为您。
https://stackoverflow.com/questions/43535565
复制相似问题