图像视频滤镜与人像美颜美妆算法详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 颜色滤镜

在 2.1 节中已经给出了颜色滤镜的定义,我们将任何通过线性或者非线性调色方式得到的新的图像颜色效果都叫作颜色滤镜。

颜色滤镜按照实现方式的不同又可以分为算法颜色滤镜和LUT颜色滤镜。

算法颜色滤镜是指完全通过算法编程来实现滤镜效果,LUT 颜色滤镜是指通过 LUT 来实现滤镜效果。

2.2.1 算法颜色滤镜

算法颜色滤镜是指该颜色滤镜完全通过编程来实现滤镜算法,进而得到滤镜效果。我们以一个简单的颜色增强滤镜为例,给大家讲解。

如图2.6所示,我们在PS中对一张照片进行饱和度调整(饱和度值为+41)。

图2.6 在PS中模拟颜色增强滤镜

图2.6 在PS中模拟颜色增强滤镜(续)

在图 2.6 中,通过对饱和度进行调节,得到了一个颜色增强滤镜效果。那么这个操作就可以看作一个简单的滤镜。这个滤镜的算法就是将饱和度值调节为+41。下面通过编程来实现这个滤镜效果。

PS中饱和度调节的算法原理如下所述。

假设在 RGB 颜色空间中,图像像素Pij)的颜色值为 RGB,调节饱和度后的颜色值为RGBN,饱和度S的取值范围为[-100,100]。

①计算颜色RGB分量的最大值和最小值,分别记作rgbMin和rgbMax:

若rgbMin与rgbMax大小相等,则RGBN=RGB。

②HSL中的L分量值为:

③计算饱和度S

④计算RGBN(以下为伪代码):

上述算法是单独调节饱和度的算法逻辑,与第 1章中的算法基础内容相同,代码可以直接使用,C语言的代码如下:

这个颜色增强滤镜的定义如下:

这样就编程实现了这个颜色增强滤镜,测试效果如图2.7所示。

图2.7 颜色增强滤镜的测试效果

从图 2.7 中可以看到,本节介绍的滤镜效果和 PS 中的滤镜效果几乎一模一样。上述整个过程就是一个普通颜色滤镜诞生的过程。一般而言,在目前的滤镜开发中,颜色滤镜的开发流程可以总结如下:

在这个流程中,设计师可以根据多种图像处理软件来设计滤镜效果,PS 只是其中之一。一旦设计师设计好滤镜效果,那么,图像算法工程师需要根据设计师的设计步骤进行算法分析,然后进行算法编程实现,最后给出滤镜的API接口供测试人员实测。

这里使用 PS 调节饱和度的过程,实际上对应的就是设计师的设计环节。在算法实现环节,如果算法能够实现设计师所设计的功能效果,那么,最终的滤镜效果也就一模一样了。本节以PS为例,正是因为在第1章中,已经给大家介绍了常用的PS功能与算法实现,这样大家就可以对应起来实现自己的滤镜了。

上述过程可以帮助大家更好地理解什么是颜色滤镜,在下一节中,我们将详解颜色滤镜的升级版—LUT颜色滤镜。

本节所有代码工程及DEMO见代码包中2.2.1文件夹中的文件。

2.2.2 LUT颜色滤镜

LUT颜色滤镜是指通过LUT(Look Up Table,查找表)的方式来实现的颜色滤镜。

常用的LUT有1D LUT、2D LUT、3D LUT三种,下面分别进行介绍。

1D LUT如图 2.8所示,这是一张 256×1大小的三通道映射 MAP,为了便于看清楚它的样子,相应地给出了放大图。

图2.8 1D LUT

从图 2.8(b)中可以看到,1D LUT 实际上是 0~255 个像素顺序排列,非常简单,当然这里给出的是横排列,读者可以使用其他排列方式,只要明白其中的原理就可以自行设计了。

这个 LUT中有 256个像素,从左到右从黑色渐变到白色,也就是像素值从 0到 255的渐变,每个像素都有 R、G、B 三个通道。通俗地理解,可以认为每个通道都是一个大小为 256的数组,数组的下标就是像素的灰度值,而数组中记录的数据就是映射之后的结果像素灰度值。在使用 1D LUT时,只需对原始 LUT进行颜色值的修改,比如在 PS中对 LUT图像进行线性亮度调节,得到一张新的亮度 LUT,那么这个 LUT 实际上就使用了三个数组,记录了亮度调节效果。在对一张目标图像进行亮度调节时,只需遍历目标图像的每个像素,根据 RGB 值,在LUT数组中查表即可得到对应效果的像素值,整个查找过程如图2.9所示。

图2.9 1D LUT原理示意图

1D LUT在 Instagram的滤镜实现过程中有较多使用,但是由于 1D LUT只能记录 256×3种颜色映射,因而只能进行简单的线性颜色变化,较受限制。

2D LUT是一个 256×256大小的映射 MAP,可以记录 256×256×3种颜色映射,比 1D LUT 有较大提升,但是与原始颜色数(256×256×256 种)相比,还具有较大差距。2D LUT也只能记录线性颜色变化,无法处理非线性颜色变化。2D LUT 举例如图 2.10(a)所示,2D LUT的生成与查找原理如下所述。

· LUT原始MAP生成原理

LUT大小为 256×256的 RGB图像,对于每一个通道,都是一张 256×256大小的灰度图,在该灰度图中,任何一点Pij)的计算公式如下:

由上述公式即可生成图2.10(a)所示的2D LUT原始MAP,该MAP不具有任何效果。

· LUT查找原理

我们以PS中的“正片叠底”图层混合效果为例,先将LUT原始MAP导入PS,然后执行“正片叠底”图层混合,即可得到正片叠底效果的LUT,如图2.10(b)所示。

对于目标图像S中的任何一点Pij),它在LUT中的查表规则如下所述。

①假设目标图像为SS中任意点的像素为Pij),对应的RGB为RGB(ij)。

②假设LUT图为M,LUT中任意点的像素为Lij)。

③假设Pij)经过LUT映射后的像素值为Dij),则Dij)按如下公式计算:

图2.10 2D LUT示意图

这里给出PS中与图2.10(b)“正片叠底”图层混合的效果对比,如图2.11所示。使用原图与自身做“正片叠底”图层混合,PS 中的效果和使用图 2.10(b)LUT 的效果基本一样,这也验证了2D LUT的实用性。

图2.11 2D LUT图层混合举例

3D LUT 是一种可以正确表示出或者通过插值计算来表示出所有颜色数量(256×256×256种)的映射 MAP。它非常适用于精确的颜色校准工作,而且能够处理从简单的 Gamma调整到高级的非线性属性、色相、饱和度等的调节。

3D LUT 也有许多种,如图 2.12所示。图中给出了 3种 LUT,分别是经典 Lev Zelensky LUT、64×64 LUT和2048×64 LUT。下面介绍最经典的Lev Zelensky基准颜色查找表。

图2.12 3D LUT举例

在正常情况下,RGB 颜色模式可以表示的颜色数量为 256×256×256=16 777 216 种,如果要记录每一种颜色的映射结果,那么需要 1600 多万条记录,这么大的工作量显然无法将其应用于实际工作中。为了简化起见,Lev Zelensky设计了如图2.13所示的3D LUT,将相近的4种颜色采用一条映射记录存储。这样,这个 LUT只需要 64×64×64=262 144条记录,大大缩减了记录量和计算量。而且,对于任何一种颜色,删除末尾 4位颜色信息,肉眼看是没什么差别的,因此,这种 LUT被广泛应用开来。目前,在“美图秀秀”“天天 P图”等 App中都有它的存在,可以说,它的出现,让颜色滤镜变得如此简单!

图2.13 经典3D LUT示意图

经典Lev Zelensky LUT的生成与查找原理如下所述。

· 经典Lev Zelensky LUT原始MAP生成原理

Lev Zelensky 查找表是一个宽度和高度均为 512 的正方形,该正方形由 8×8 个宽度和高度均为64的正方形组成,查找表与像素RGB值的关系如下所述。

①对于每一个 64×64大小的小正方形而言,它的 x坐标代表的是像素的 R值,R计算如下:

②对于每一个 64×64大小的小正方形而言,它的 y坐标代表的是像素的 G值,G计算如下:

③对于 8×8个小正方形,从左上角到右下角顺序排列标号 0~63,小正方形所在位置的标号代表的是像素的B值,B计算如下:

根据上述步骤①~③,我们就可以编程自动生成一张Lev Zelensky基准颜色查找表了。

· 经典Lev Zelensky LUT的查找原理

关于 Lev Zelensky LUT 的查找原理,在理解了它的生成原理之后,就可以逆向操作进行查找了。鉴于内容重复,这里不再累赘,直接给出代码(此代码进行了移位优化):

对于Lev Zelensky LUT的应用,就目前而言,几乎所有的图像/摄像类App、PC图像处理软件都在使用。从滤镜到美颜美妆,但凡涉及像素调色内容,都是可以使用Lev Zelensky LUT的。使用Lev Zelensky LUT的优缺点如下所述。

优点:

①极大地简化了代码,将复杂的算法计算简化为一次 LUT 操作,有助于算法本身的代码保护。

②LUT更容易进行 OpenGL渲染,可以轻松应用于 Camera实时预览和视频实时处理,速度快,效果稳定。

③LUT 的设计更容易进行资源配置化,从设计师到效果上线不需要过多的人力、物力和时间。

缺点:

①由于 LUT以图像资源的方式存在,而且必须是 BMP和 PNG等无压缩损失格式,因而占用空间较大,随着LUT数量的增多,会增加软件包的大小。

②LUT资源容易被破解、泄密。

③在一些嵌入式开发中,对内存要求苛刻,因而应用受限。

我们完整介绍了LUT颜色滤镜的内容,鉴于3D LUT的重要性,本节对2016—2018年市面上几款主流App进行了统计,各大App中LUT的使用情况如表2.1所示。

表2.1 2016—2018年主流App中LUT使用统计表

看到上面的统计,大家就可以发现,LUT 在照片、视频美化特效方面应用十分广泛,不可或缺。当然,本节针对3D LUT只介绍了一种模型,实际上,掌握了方法原理,你可以按照自己的方式创造出不同的LUT样式,如图2.12所示,本节这里就算抛砖引玉吧。

下面我们只对3D LUT的使用进行C语言程序实现。对于Lev Zelensky经典查找表的生成,大家不需要用代码实现,只需复制一份原始查找表即可,原始查找表在代码包的 2.2.2 文件夹中。代码如下:

为了测试效果,我们使用前文介绍的PS调节的颜色增强滤镜来生成LUT。调用LUT查找代码,得到增强滤镜效果,对比算法实现效果和 PS 实现效果,如图 2.14 所示。从效果上看一模一样。这里我们不再列举其他滤镜特效了,实在是数不胜数,大家可以自行体验相关的 App。

图2.14 颜色增强滤镜效果对比

本节所有代码工程及DEMO见代码包中2.2.2文件夹中的文件。