基于GPUImage如何实现实时美颜滤镜

今天将主要介绍基于GPUImage实现美颜滤镜的原理和思路。图玩智能科技为企业提供更稳定更优质的美颜产品及服务,欢迎咨询www.toivan.comgit

GPUImage

     GPUImage 是一个开源的基于GPU的图片或视频的处理框架,其自己内置了多达120多种常见的滤镜效果。有了它,添加实时的滤镜只须要简单地添加几行代码。下面的例子是以摄像头的数据为源,对其实时地进行反色的操做(相似相片底片的效果):github

利用GPUImage对摄像头数据添加滤镜的示例2.1算法

其实美颜也是同样,若是有这么一个美颜的滤镜(姑且叫作GPUImageBeautifyFilter),那么只须要把示例2.1中的GPUImageColorInvertFilter替换成GPUImageBeautifyFilter便可。咱们只须要作一个GPUImageBeautifyFilter就能实现实时美颜了,问题来了,到底什么算是美颜呢?个人理解是,你们对于美颜比较常见的需求就是磨皮、美白。固然提升饱和度、提亮之类的就根据需求而定。本文将着重介绍磨皮的实现(实际上GPUImageBeautifyFilter也实现了美白、提亮等效果)。框架

磨皮函数

     磨皮的本质其实是模糊。而在图像处理领域,模糊就是将像素点的取值与周边的像素点取值相关联。而咱们常见的高斯模糊 ,它的像素点取值则是由周边像素点求加权平均所得,而权重系数则是像素间的距离的高斯函数,大体关系是距离越小、权重系数越大。下图3.1是高斯模糊效果的示例:工具

高斯模糊效果示例3.1spa

    若是单单使用高斯模糊来磨皮,获得的效果是不尽人意的。缘由在于,高斯模糊只考虑了像素间的距离关系,没有考虑到像素值自己之间的差别。举个例子来说,头发与人脸分界处(颜色差别很大,黑色与人皮肤的颜色),若是采用高斯模糊则这个边缘也会模糊掉,这显然不是咱们但愿看到的。而双边滤波(Bilateral Filter) 则考虑到了颜色的差别,它的像素点取值也是周边像素点的加权平均,并且权重也是高斯函数。不一样的是,这个权重不只与像素间距离有关,还与像素值自己的差别有关,具体讲是,像素值差别越小,权重越大,也是这个特性让它具备了保持边缘的特性,所以它是一个很好的磨皮工具。下图3.2是双边滤波的效果示例:视频

双边滤波效果示例3.2blog

     对比3.1和3.2,双边滤波效果确实在人脸细节部分保留得更好,所以我采用了双边滤波做为磨皮的基础算法。双边滤波在GPUImage中也有实现,是GPUImageBilateralFilter。图片

    根据图3.2,能够看到图中仍有部分人脸的细节保护得不够,还有咱们并不但愿将人的头发也模糊掉(咱们只须要对皮肤进行处理)。由此延伸出来的改进思路是结合双边滤波,边缘检测以及肤色检测。总体逻辑以下:

 

磨皮处理逻辑图3.3

     Combination  Filter是咱们本身定义的三输入的滤波器。三个输入分别是原图像A(x, y),双边滤波后的图像B(x, y),边缘图像C(x, y)。其中A,B,C能够当作是图像矩阵,(x,y)能够当作其中某一像素的坐标。Combination  Filter的处理逻辑以下图:

Combination Filter逻辑图3.3

     下面是主要的shader代码:

combination filtershader代码3.4

     Combination Filter经过肤色检测和边缘检测,只对皮肤和非边缘部分进行处理。下面是采用这种方式进行磨皮以后的效果图:

最终磨皮效果图3.5

     对比3.5与3.2,能够看到3.5对人脸细节的保护更好,同时对于面部磨皮效果也很好,给人感受更加真实。

相关文章
相关标签/搜索