3D Lut 电影级调色算法 附完整C代码

在前面的文章,我提到过VSCO Cam 的胶片滤镜算法实现是3d lut。

那么3d lut  到底是个什么东西呢?

或者说它是用来做什么的?

长话短说,3d lut(全称 : 3D Lookup table )它是通过建立一个颜色映射表,对图像的色调进行重调的算法。

有用于摄像机的效果美化润色,例如一些所谓的数码相机之类的。

也有用于影视后期调色,渲染影视作品的颜色基调等等。

简单的说,你想要把图片上的一些颜色通过你自己的预设给替换掉。

例如红色换成白色,白色换成绿色。

当然这在现实中操作起来非常复杂。

因为 RGB888(8+8+8=24位色):

(2^8)*(2^8)*(2^8)=

256*256*256=16777216

有16M 种颜色,如果采用手工操作的方式一个一个颜色地换,那人还活不活了。

所以就有通过建立映射表进行插值达到逼近这种效果的算法。

它就是3d lut,当然也有2d lut,1d lut。

精度不一,效果不一。

例如:

调节亮度 可以认为是1d lut.

调节对比度 可以认为是 2d lut.

而调节整体的色调最佳肯定是3d lut.

当然2d lut 也是可以做到,但是精度就没有那么高了。

我之前也提到过,市面有不少app是采用2d LUT,毕竟精度不需要那么高。

2d够用了。

但是在摄影界,影视后期这一行当里,3d lut是标配。

相关资料可以参阅:

在VSCO Cam APP中滤镜效果每一档都是一个17*17*17的3d lut预设。

先上个图,大家感受一下。

只是一个例子,效果是看做预设的功底的。

那么3d lut 的实现具体是什么算法呢?

当然据我所知,Trilinear_interpolation 是用得最广泛的一种。

之前做APP滤镜的时候,调研过不少资料。

但是当时发现一些开源项目的实现是有问题的,插值算错坐标之类的。

有一次心血来潮,去翻了翻FFmpeg的代码,居然发现了它也有实现3d lut算法。

嗯,站在巨人的肩膀上。

抽了点时间对FFmpeg中的3d lut 进行了整理。

提取出它的算法,并编写示例。

当然未经过严格验证,应该存在一些小Bugs。

完整示例代码献上:

项目地址:

命令行参数:

lut3d 3d预设文件  图片路径

例如: lut3d ../god.cube ../sample.jpg

用cmake即可进行编译示例代码,详情见CMakeLists.txt。

算法细节就不展开说了,

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 
gaozhihan@vip.qq.com