LutFilter:3D LUT简介与应用
简介
LUT是“Look-Up-Table”——查找表的缩写。它是数据的一种容器,类似字典、map等,将索引与值对应起来的一种描述方式。
3D LUT,顾名思义,描述索引与值之间的对应方式是三维的,可以被理解为三个维度的索引-值对应方式的结合,通过三个维度的索引,可以查找到一个值。与一本普通的字典一样,输入固定的值作为索引,可以查到固定的结果作为输出。
3D LUT被广泛地在电影工业和显示工业广泛使用,用于在不同的显示器、不同的颜色空间之间做色彩校正、显示调节、效果和优化等方面。也就是说,3D LUT实际上是颜色的转换,是RGB的映射。借助3D LUT的颜色映射,将颜色进行调节,达成3D LUT即定的显示效果。
1D LUT只能控制gamma值、RGB平衡(灰阶)和白场(white point),而3D LUT能以全立体色彩空间的控制方式影响色相、饱和度、亮度等。简单描述来说3D LUT可以影响到颜色,而1D LUT只能影响亮度值。
由于颜色空间、gamma、色域等会影响颜色的呈现效果,因此想要让LUT有较好的效果,一般要求输入的颜色和输出的颜色在同一个显示环境下(颜色空间、色域、伽马一致)。
得益于颜色映射,富有创意的艺术家们能调出效果绝伦的LUT,通常会用于显示效果调节、色彩管理、美颜P图、显示器校正等方面,有很大的实用价值。
- 技术型LUT:用于颜色转换,校准显示器,显示补偿,硬件矫正,色彩管理,色彩过滤,失真弥补,硬件偏色改善
- 创意型LUT(风格LUT):用于显示风格的转换、美化、调色、多图合成(图像叠加)
直观了解3D LUT
先来看看LUT能达到的效果,看上去就是平平无奇的滤镜。
下图为两位特邀模特的演示图,图的右半部分分别应用了一个黑白化、鲜艳化的3D LUT:
一个调整对比度的案例:
一个调整对比度+明度的案例:
3D LUT的基本结构和表示方法
3D LUT是一种统称,表示RGB三个维度的颜色映射规则表,有很多种文件格式,包括文本类型的cube,图片类型的png等。
立体地来理解3D LUT,就像一个有X、Y、Z三轴的三维坐标系,分别是RGB三个分量:
颜色的查找实际上就是将RGB当作XYZ,在表中查找得到映射后的RGB值:
如前述,3D LUT有不同的文件格式,不同的文件格式有不同的使用方式和性能表现,在工业界平台的技术栈和性能要求,对3D LUT的文件格式的选型有决定性的影响。
实际应用时,3D LUT往往使用cube格式,其便利性、性能表现有明显优势,下文会简单介绍,其结构如下。
将LUT按立方体进行面分割并平铺每一个面,如下。
cube格式的核心思想是,将三维维度转换为二维维度。将R与G分量组成小的二维坐标系(小方片),整个cube有N个小方片,每个小方片内部B分量固定,小方片B分量互相之间自然增长。
通俗来说,每一个小方格子里面的内部横坐标是红色,纵坐标是绿色。蓝色是固定不变的,只会随着小方片的序号的增长而增长。
左上角一点蓝色都没有,所以很红很绿;右下角蓝色很多,看上去很蓝。
3D LUT按照面划分就是16x16x16,32x32x32,64x64x64,256x256x256……,我们知道面由线段围成,而一根线段有两个端点,因此一个3D LUT按照端点来计算深度,那么就有17x17x17,33x33x33,65x65x65,257x257x257的表示方法。
上图的cube是一个64x64x64的3D LUT。我们知道RGB颜色空间取值有256个(0~255),因此64x64x64的3D LUT实际上是不能表示所有颜色的。
因此它有如下特点:
- 每个输入的RGB,如果不是刚好落到整数点上,此时换算不那么直接(比如输入的R分量刚好是点1和点2中间的位置,此时到底用点1还是点2,还是点1和点2的平均值,还是插值计算)来映射
- 换算不那么直接,意味着有一定的精度差异,低精度误差大,高精度消耗内存、消耗LUT文件解析时间(256256256的cube大约占据48M左右的空间)
- 不论LUT层数是否足够高,都会碰见需要插值或降低采样的场景
- 人眼分辨能力、颜色学、内容颜色精度、显示器屏幕质素等因素客观上决定了,颜色的轻微偏差不会被察觉,不会对显示效果造成影响
下图为256层的LUT:
还有一种竖直排列各层的形式(这里将它做了旋转,变成横向排列。按照B分量的方向来看,它是竖向排列的):
通过图片来存储的3D LUT,有个很突出的特点,就是图片本身的外观就是3D LUT提供的调色风格,如上面一个LUT的风格看上去是让图片更加鲜艳,而如下这个LUT则看上去让图片变的带有棕褐色色调:
这个则一眼能看出来可以抹掉色彩,让图片变成黑白图。
3D LUT的优势
3D LUT具有一些突出的特性和优势。
- 性能
3D LUT本身是查找表,将本该经过计算得到的映射结果预先存储下来,用于直接读取,避免了对像素点的映射计算。是一种空间换时间的算法,有高响应速度的保证。
- 灵活程度大,带来更好的效果
常规的滤镜是单一映射,通常会将整个图像的所有像素机械地进行映射。如一个暖色调的普通滤镜会让图像内原本已经很暖的颜色变的更暖,甚至失真。而3D LUT则可以实现控制,不同像素值会有不同的非线性的映射效果。
- 支持硬件加速
高响应速度的图像处理通常需要GPU或FPGA进行加速。3D LUT可以加载为纹理,通过OpenGL进行绘图
- 风格和效果的自定义自由度大、简单
LUT文件的制作比较简单,风格和效果可以由富有创意的艺术家们随心所欲地随时创建
- 用户自定义自由度大
用户可以随时下载或制作符合规范的LUT,在不修改软件的前提下,任意地设置LUT,实现不同的效果
- 兼容性高
3D LUT实现的调色可以在任意没有接入调色功能的应用(如系统应用、三方应用、浏览器、视频流、相机流),无感、无侵入的实现调色,被调色的目标不会出现任何兼容性问题,也没有任何侵入性,跨平台的移植性也很高
- LUT的基本使用
LUT的基本应用流程主要为创建LUT、导入LUT、根据LUT映射新的像素值并绘制三大流程。其中对于Android平台,流程的重点难点在于绘制过程,通常借助OpenGL在GPU进行绘制。
OpenGL绘图的基本流程如上。使用3D LUT进行调色,可以实现为在片段着色器中读取原图像素的颜色值,根据LUT映射为新的颜色值,实现绘图