Color Lookup Table

在影像处理领域中,当我们想要调整一个影像的色彩时,经常会用到 Color Lookup Table 的技术。

举个简单的例子,如果我们想要让影像中的每个像素的R值变为原本的0.3倍,最基本的做法就是把每一个像素的R值乘以0.3,假设像素的大小为1000X1000,那么总共要1000000次浮点运算。

如果我们一开始先创建一张表,把所有颜色值经过处理(R值变为0.3倍)之后的结果记录起来,然后把每个像素的色彩拿去查表,得到处理之后的色彩值,那么我们只要做1000000次查表操作,会比浮点运算快很多。实际上大部分色彩调整的算法都比这个例子复杂许多,因此更能凸显出查表法的高效率。

所以什么是 Color Lookup Table 呢,顾名思义,就是一张颜色映射表,也就是基准图,用于查询一个像素需要映射的颜色值。不过如果要把所有色彩的处理结果都存起来,那这张表势必会相当大。以 RGB 24 bits 为例,每个像素占3 bytes,而总共会有16777216(256X256X256)种色彩,总共占48MB(256X256X256X3 bytes),看来并不小。因此实际上我们并不会记下所有的色彩,而是只记下部分的色彩,其他不在表内的色彩则用内插值取得处理后的结果。

当然了,由于基准图的特性,这种方式只能进行颜色上的调整(曲线,色彩平衡等),其他效果调整也只限于利用图层间混合模式的更改,例如可做暗角、漏光等效果。


接下来,我们一步步来看怎么制作一个自己的滤镜。

我们主要讲iOS的制作流程,android也是类似的。

一、在GPUImage框架中找到lookup.png这张图,图的大小是512X512,也就是64X64X64。

二、打开Photoshop,选取一张原始图。

三、为这张图创建一个组,调一下颜色。

四、现在我们效果调好了,我们需要把效果应用到步骤一中的基准图,我们会得到一张新的基准图。

五、接下来就借用GPUImage框架中的GPUImageLookupFilter来实现我们的效果吧。

总结:从Demo最终的效果来看,与我们之前在Photoshop处理出来的效果几乎是一样的。

最后我们一起简单分析一下GPUImageLookupFilter中的脚本。