1.背景

前段时间由于项目需求,做了一个基于GPUImage的实时美颜滤镜。现在各种各样的直播、视频App层出不穷,美颜滤镜的需求也越来越多。为了回馈开源,现在我把它放到了GitHub

https://github.com/Guikunzhi/BeautifyFaceDemo

上面,感兴趣的朋友可以去下载。下面将主要介绍实现美颜滤镜的原理和思路。

2.GPUImage

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

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

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

3.磨皮

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

高斯模糊效果示例3.1

如果单单使用高斯模糊来磨皮,得到的效果是不尽人意的。原因在于,高斯模糊只考虑了像素间的距离关系,没有考虑到像素值本身之间的差异。举个例子来讲,头发与人脸分界处(颜色差异很大,黑色与人皮肤的颜色),如果采用高斯模糊则这个边缘也会模糊掉,这显然不是我们希望看到的。而双边滤波(Bilateral Filter) 则考虑到了颜色的差异,它的像素点取值也是周边像素点的加权平均,而且权重也是高斯函数。不同的是,这个权重不仅与像素间距离有关,还与像素值本身的差异有关,具体讲是,像素值差异越小,权重越大,也是这个特性让它具有了保持边缘的特性,因此它是一个很好的磨皮工具。下图3.2是双边滤波的效果示例:

双边滤波效果示例3.2

对比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 filter的shader代码3.4

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

最终磨皮效果图3.5

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

4.延伸

我所采用的磨皮算法是基于双边滤波的,主要是考虑到它同时结合了像素间空间距离以及像素值本身的差异。当然也不一定要采用双边滤波,也有通过改进高斯模糊(结合像素值差异)来实现磨皮的,甚至能取得更好的效果。另外GPUImageBeautifyFilter不仅仅具有磨皮功能,也实现了log曲线调色,亮度、饱和度的调整,具体详情可以参见demo 。

https://github.com/Guikunzhi/BeautifyFaceDemo

androidgpuimage_基于GPUImage的实时美颜滤镜相关推荐

  1. 美狐人脸识别SDK技术,人脸检测SDK技术达到实时美颜滤镜的效果

    为了实现高颜值又不失真的直播实时美颜滤镜的功能,技术关键点主要涉及人脸识别SDK技术和人脸检测SDK技术,对特征点定位与跟踪.特效处理.美白和磨皮四个方面.下面依次介绍这四个主要功能点: 1.美狐人脸 ...

  2. android照片美颜项目_Android OpenGLES 实时美颜(磨皮)的优化

    在介绍实时美颜算法之前,你可以参考程序员杠把子的博客: http://blog.csdn.net/oshunz/article/details/50536031 实时美颜算法考虑到性能的影响,PC平台 ...

  3. 基于GPUImage的美颜BeautifyFace详细注释

    GPUImageBeautifyFilter.h文件中 #import <GPUImage/GPUImage.h> @class GPUImageCombinationFilter; @i ...

  4. 基于GPUImage的多滤镜rtmp直播推流

    之前做过开源videocore的推流改进:1)加入了美颜滤镜; 2) 加入了librtmp替换原来过于简单的rtmpclient: 后来听朋友说,在videocore上面进行opengl修改,加入新的 ...

  5. 你今天怎么这么好看——基于深度学习的大型现场实时美颜

    Photo from BoredPanda 美颜是当下直播甚至是所有形式对外展示的一个必备条件.手机端的美颜就像私人化妆师,能够帮助我们实现各种心仪的效果. 而大型娱乐节目一般都是提前进行录制,然后进 ...

  6. C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-夏曹俊-专题视频课程...

    C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-11788人已学习 课程介绍         C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程 ...

  7. android基于gpuimage和photoview的图片编辑(滤镜,饱和度,裁剪)

    android基于gpuimage和photoview的图片编辑(滤镜,饱和度,裁剪) 前言 此博客方便自己使用与他人交流,未经同意不允许他人转载 以前在项目中遇到图片处理的需求,滤镜.饱和度处理和裁 ...

  8. 1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...

  9. android gpuimage 直播,1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜...

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 上 ...

  10. 美颜滤镜sdk常用的图形处理算法、代码分析

    美颜滤镜sdk目前在视频.图文社交平台中的使用率是非常高的,特别是短视频平台和直播平台.今天小编就为大家讲解一下美颜滤镜sdk经常用到的算法和代码. 一.预处理算法.检测算法 在采集完图像后,首先会对 ...

最新文章

  1. 使用node.js进行API自动化回归测试
  2. 小程序获取input 的value_[小发现] 现在可以获取任意小程序的小程序码了!
  3. 使用Nant构建入门
  4. 缺货警告!小米这款手机已被骂惨...
  5. 从零开始刷Leetcode——数组(27.35.53)
  6. android查看第三方libs的jar源码
  7. python类:magic魔术方法
  8. hex2bin 64bit
  9. 微信公众平台 服务器配置 提示token验证失败
  10. 袋鼠云数据湖平台「DataLake」,存储全量数据,打造数字底座
  11. 简单好用的服务器压力测试小工具 ab
  12. 中国大学MOOC 浙江大学《程序设计入门——C语言》第6周:数组与函数 测验与作业(高精度小数)
  13. 学习大数据开发培训前景如何
  14. java最常见的三种问题,404,500以及无法访问
  15. ZW32-12型户外柱上高压真空断路器
  16. 动态规划---最小硬币数(Python)
  17. 东莞理工学院计算机专业实力如何,2019东莞理工学院专业排名
  18. 一文带你读懂CNCF Landscape
  19. 13.2 磁盘分区之交换分区,raid命令,LVM--word
  20. js 中定义的 全局变量,局部变量

热门文章

  1. redission分布式锁
  2. 阿里云 DTS 实践
  3. 设计模式-适配器模式(Adapter)
  4. 10月31 安装redis报错
  5. 关于http协议详解(摘)
  6. 详尽解读中美科技差距究竟多么巨大
  7. uva 11426 GCD - Extreme (II)
  8. 值得看的youtube频道
  9. Android 使用字符串动态获取资源ID
  10. 结构体链表赋值与删除