首页 > 编程知识 正文

android,faldetector反美颜系统

时间:2023-05-06 10:54:03 阅读:136432 作者:4222

1 .背景

在此期间,根据项目的需求,制作了基于GPUImage的实时美颜滤镜。 现在,各种各样的演唱会、视频APP层出不穷,美颜过滤器的需求也在增加。 为了回馈开源,现在我把它放在GitHub上,感兴趣的朋友可以去下载。 主要介绍实现美颜过滤的原理和思路。

2.GPUImage

GPUImage是一个基于GPU的开放源代码图像和视频处理框架,它本身内置了多达120多种常见的滤镜效果。 有了它,添加实时滤镜只需简单地添加几行代码。 以下示例是基于相机数据实际反转颜色的操作(类似于照片中的负片效果)。

在GPUImage中向相机数据添加滤镜的示例2.1

其实美颜也一样。 如果有这样的美颜滤镜(暂时称为GPUImageBeautifyFilter ),只需将示例2.1中的GPUImageColorInvertFilter替换为GPUImageBeautifyFilter即可。 我们只需制作GPUImageBeautifyFilter就能实现实时美颜。 问题是,到底什么是美颜呢? 我的理解是,大家对美颜的一般需求是剥皮、美白。 当然,提高饱和度、使其变亮等因需求而异。 本文重点介绍蒙皮的实现。 实际上,GPUImageBeautifyFilter也实现了美白、高光等效果。

3 .剥皮

剥皮的本质实际上是模糊的。 另一方面,在图像处理领域中,模糊是指将像素点的可取值与周边像素的可取值相关联。 我们常见的高斯模糊是像素点的可取值从周边像素点加权平均得到的,权重系数是像素间的距离的高斯函数,距离越小权重系数越大,是大致的关系。 下图3.1是高斯模糊效果的示例:

高斯效应示例3.1

如果只使用高斯模糊磨皮,得到的效果并不理想。 原因是高斯模糊只考虑了像素间的距离关系,没有考虑像素值本身的差异。 例如,头发和人脸的分界线(颜色差异很大,黑色和人的肤色),采用高斯模糊的话这个边缘也会模糊,显然不是我们想看的。 双边滤波器考虑颜色之差,像素点的取值也是周围像素点的加权平均,并且权重也是高斯函数。 不同之处在于,该权重不仅与像素之间的距离有关,还与像素值本身的差异有关。 具体来说,像素值的差异越小权重就越大,该特性具有保持边缘的特性,因此是优秀的剥皮工具。 下图3.2是双边滤波器的效果示例:

双边滤波效果示例3.2

比较3.1和3.2,双边滤波效果确实在人脸细节上保留得很好,所以我采用双边滤波作为剥皮的基础算法。 双边滤波器在GPUImage中也实现了,是GPUImageBilateralFilter。

根据图3.2,可以看出图中还没有充分保护人脸的细节,也不想模糊人的头发(只处理皮肤) 由此扩展的改进思路是将双边滤波器、边缘检测器和肤色检测器组合起来。 总体逻辑如下。

剥皮处理逻辑图3.3

Combination Filter是我们自己定义的三输入滤波器。 3个输入分别是原图像a[x,y]、双边滤波后的图像b[x,y]、边缘图像c[x,y]。 这里,a、b、c可以看作图像矩阵,(x,y )可以看作任意一个像素的坐标。 Combination Filter的处理逻辑如下图所示。

合成过滤器逻辑图3.3

主要shader代码如下所示。

combination filter着色器代码3.4

Combination Filter通过肤色检测和边缘检测,仅处理皮肤和非边缘部分。 这样进行剥皮后的效果图:如下所示

最终剥皮效果图3.5

比较3.5和3.2,可以发现3.5对脸部细节的保护更好,同时脸部剥皮效果也更好,感觉更真实。

4 .扩张

我采用的剥皮算法是基于双边滤波器的,主要是同时结合了像素之间的空间距离和像素值本身的差异。 当然也没有必要采用双边滤波器,有些可以通过改善高斯模糊(组合像素值的差异)来实现剥皮,还可以获得更好的效果。 另外,GPUImageBeautifyFilter不仅具有剥皮功能,还实现了log曲线的调色、亮度、彩度的调整。 具体详情请参照demo。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。