磨皮三部曲---算法小白篇

Posted Trent1985

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了磨皮三部曲---算法小白篇相关的知识,希望对你有一定的参考价值。

  • 中性灰磨皮

中性灰磨皮法是人像修图中比较常用的磨皮方法,随着自动修图软件的发展,目前商业修图中如美图云修、像素蛋糕等都使用了基于AI的中性灰磨皮算法。中性灰的相关PS教程非常之多,很多介绍的也非常详细,但大多都是从设计师或者照片精修师角度来讲,本文将从算法工程师角度(或者说从美颜算法开发角度)来帮助初学者理解什么是中性灰修图。

中性灰磨皮修图的算法思想

我们给出如下一张示例图Fig.1,这张图像是人脸皮肤的一块区域,在这个区域中,皮肤存在一些痘痘瑕疵,这里的目标是去除瑕疵,改善皮肤。

所谓的中性灰磨皮,实际上就是构建一张中性灰度图层,通过对这张图层的处理,来对原图中的像素进行颜色亮度调整,一般表现为过亮的区域调暗,过暗的区域调亮处理。如下图中Fig.1所示,皮肤痘痘的区域,相对皮肤区域是较暗的区域,我们可以对这些区域进行调亮处理,从而让它的亮度与周围区域保持一致,进而达到修图的目的。

基于上述思想,我们首先创建一张与原图大小一样的中性灰图层,这个图层的颜色RGB为(128,128,128),也就是50%的灰色,如下图Fig.2所示。

    假设我们要修的原图为S,中性灰图为A,在原图S中,存在正常皮肤区域,过暗区域(如痘痘,痣等),过亮区域(如高光等),那么,我们构建这样一个数学模型:

       存在一个函数映射F,使得:                           

                                      

    上述函数映射F满足:

    ①对于中性灰图层A,F函数输入原图S,输出结果图也为S,即,无像素值改变;对于图Fig.1而言,即正常皮肤区域保持像素值不变;

       ②对于中性灰图层A,A亮度增加时,F输入S,输出为提亮之后的S,即,原图像素被提亮;对于图Fig.1而言,即痘痘区域变亮;

       ③对于中性灰图层A,A亮度减少时,F输入S,输出为调暗之后的S,即,原图像素被调暗;对于图Fig.1而言,即高光区域变暗;

       有了上述数学原型,我们就可以通过对中性灰图层A中对应痘痘区域的调亮和高光区域的调暗,来达到磨皮的效果。这就是中性灰磨皮,由于它改变的是图层A,对原图S尽可能的保留了纹理信息,因此,可以保留较多的皮肤质感。

    那么,函数F的映射如何寻找呢?

       实际上Photoshop中已经为我们提供了几种,在Photoshop的图层混合中,有柔光图层混合/线性光图层混合和叠加图层混合三种模式,这三种模式就是三个函数映射F,使用任何一种,都可以进行中性灰磨皮,这也是大多数PS教程使用这三种模式进行磨皮的原因。

       假设基图层为Base,混合图层为Mix,结果为Res:

柔光图层混合公式:

线性光图层混合公式:

叠加图层混合公式:

    上述三个图层混合公式,都是满足我们的数学模型的。

       了解掌握了中性灰磨皮的原理之后,我们就不难理解相关PS教程的操作步骤了,我们以柔光图层混合为例,使用黑白画笔工具,通过对中性灰图层A的涂抹来磨皮,效果如下Fig.3:


                                                                            Fig.3

       可以看到中性灰图层A中,白色区域即我们涂抹的痘痘区域,较暗的区域即我们涂抹的高亮区域,通过这种方式,可以达到对皮肤的修复效果;

       在实际的PS应用中,我们一般会将人像皮肤中较大的痘痘区域直接使用修补工具去除掉,然后对于剩下的皮肤区域进行中性灰修复,对于高端的商业修图而言,往往是精细到毛孔级别,因此,所带来的代价就是时间消耗,往往修一张图要数个小时之久甚至以天为单位计算。

       中性灰修图实际上并不局限于磨皮,它还可以用来修正人脸的高光和阴影信息,比如说添加五官立体效果等。以立体鼻梁为例,主要是通过在鼻梁两侧进行中性灰图层的调暗,构建鼻梁阴影,在鼻梁中间进行中性灰图层的调亮,构建高光信息,从而形成更加立体的鼻梁效果。举例如下图Fig.4所示:

  • 高低频磨皮

       图像的信息可以划分为高频信息和低频信息,高频信息包含了图像的细节,而低频信息则包含了图像的轮廓和平坦区域。所谓高低频磨皮即将图像划分为高频信息和低频信息,分开处理,低频磨皮,高频保留细节,进而达到细节保留的磨皮效果的方法。

       如何将图像划分为高低频?通常我们使用高斯滤波来实现,高斯滤波是低通滤波器,假设原图为S,高斯滤波之后即为低频图D,而高频图即S-D。举例如下图Fig.5所示:

        有了高频信息和低频信息,我们使用如下公式将其还原:

                                                        原图=高频+低频-255

       在Photoshop中,即低频图层与50%透明度的高频图层做线性光图层混合,如果透明度超过50%,那么,即会出现细节增强效果,反之,细节弱化。

       我们使用高低频磨皮来测试,效果如下Fig.6所示:

       高低频磨皮在Photoshop中操作时,需要在保留图像边缘的情况下,对低频区域进行滤波,可以是高斯滤波也可以是表面模糊,但是前提都是需要比较强的人工干预,才能得到比较好的效果。但是对于算法自动化而言,这一步要做好,非常不容易。以人像为例,我们需要把皮肤区域磨平,但是,又要保留五官轮廓、衣服、头发甚至发丝不被损坏等,而这些case往往依赖于基于深度学习的分割和Matting算法,目前要做的非常精细还有较大挑战。

       总结一下,高低频磨皮的流程模型如下:

  • 通道磨皮

       所谓通道磨皮,是指从原图的RGB三通道中,选取一个特征明显的通道,作为痘印的选区通道(这个通道一般是G通道或者B通道,在PS中根据具体用户图来选择),根据选取通道确定痘印区域,然后对该区域对应的原图进行提亮处理,进而将痘印颜色减淡至消失,这种方法叫做通道磨皮法。

       通道磨皮的核心思想是:通过通道选择,确定痘印比较明显的暗部区域,对原图的暗部区域进行调亮来达到痘印颜色减淡的效果,从而修复皮肤区域。

        通道选择问题

       一幅图的RGB三通道,对于痘痘区域,表现是不一样的,痘痘斑点一般多为深色区域,因此,相对而言G和B通道对比要更加明显,如下图Fig.7所示。


                                                                     Fig.7 

       在Fig.7中,我们可以看到,通道G中痘印的对比度更加强烈,更加容易区分皮肤区域,而R通道最不明显, 如果我们选择了R通道,那么很多痘痘与皮肤区域是无法区分开来的。这也就体现了通道选择的重要性。

       我们先给一张示意图,如图Fig.8,然后具体分析。


                                                                     Fig.8

       下面我们来说下通道磨皮的具体做法,如下:

1,选择原图S的G通道,构建灰度图G;

2,对G做高反差保留,得到G_HP;

3,对G_HP和G_HP自身做“叠加”图层混合,执行3-5次,最后一次执行“线性光”图层混合,得到图层C,如上图通道C所示;

4,CTRL+点击通道C,会自动选中通道C中的白色区域,CTRL+SHIFT+I反选,得到痘印所在的暗色选区,对该选区所在的原图构建蒙版,即可得到痘印区域图;

5,对痘印区域图进行曲线调节-提亮处理,亮度调节到痘印消失即可;

6,最后,将非皮肤区域涂抹为原图,得到结果图如图所示。

       如果要得到较好的效果,可以对效果图做高斯模糊,然后在做一次高低频磨皮。

       对于算法工程师而言,我们主要关注的是痘印区域的选择,实际上上面的PS步骤中,在5-6步骤中,存在大量的设计师手工操作,这些操作主要是解决非皮肤或非痘痘区域的排除,因此,如果要把流程自动化,我们需要通过痘痘检测+皮肤分割来构建完整的精确的通道C,这样即可达到自动化处理的目的。

       总览上述三种磨皮算法,不管是哪一种,对于我们算法工程师而言,如果要自动化处理,都必须要构建精确的痘痘检测、皮肤分割模块,有了这两个模块,剩下的步骤就可以随心所欲了。

       最后,给出本人算法的一些效果图。

原图                                                                          算法效果图

 

 

以上是关于磨皮三部曲---算法小白篇的主要内容,如果未能解决你的问题,请参考以下文章

磨皮三部曲---算法小白篇

ps-通道+高低频磨皮去斑

ps-通道+高低频磨皮去斑

ps-通道+高低频磨皮去斑

高低频磨皮

Android OpenGLES 实时美颜(磨皮)的优化(二)