上一章完毕了对图片的磨皮处理。经过简单算法流程优化,能够达到非常快的速度。可是不能用于实时美颜。经实验,若採用仅仅处理Y信号的方案。半径极限大约是5-10,超过10则明显感受到卡顿。但对于1920X1080的预览分辨率来说。取10为半径非常难得到理想效果。即使将分辨率减少到1280X720也差强人意。所以非常难简单的直接应用在移动端实时处理上。
还有一方面,人物的正常肤,色应该是偏红。所以则会导致人物图像的红色通道偏亮,使红色通道保留的细节成分较少,相比之下。绿色通道保留很多其它细节,所以。普通情况下我们也能够仅仅採用过滤绿色通道来实现实时磨皮。以下对思路简介:

1.取出绿色通道,对绿色通道进行模糊处理,比如高斯模糊。得到模糊后的值sampleColor:
在顶点着色器中创建长度为20~25的数组,作为片段着色器须要取数据的点	
        varying vec2 blurCoordinates[20];
	blurCoordinates[0] = inputTextureCoordinate.xy + singleStepOffset * vec2(0.0, -10.0);
....
blurCoordinates[19] = inputTextureCoordinate.xy + singleStepOffset * vec2(4.0, -4.0);</span>

在片段着色器依次取出这些点的绿色通道值,乘以权重。最后除以总权重。得到模糊后的绿色通道值


2.用原图绿色通道值减去sampleColor。加上0.5(即128),1+2两个步骤即PS中的高反差保留:
	vec3 centralColor = texture2D(inputImageTexture, textureCoordinate).rgb;
float highpass = centralColor.g - sampleColor + 0.5;

3.对上述结果值进行3-5次强光处理(见第七章的“叠加”混合模式)。此步骤能够使得噪声更加突出:
        if(color <= 0.5){
color = color * color * 2.0;
}else{
color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
}

经过1-3之后的图:



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

4.计算原图的灰度值,公式为0.299*R + 0.587*G + 0.114*B:
       const highp vec3 W = vec3(0.299,0.587,0.114);
float lumance = dot(centralColor, W);
得到灰度图像:


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
5.将灰度值作为阈值,用来排除非皮肤部分。依据灰度值计算,将原图与1-3后的结果图合成:
	float alpha = pow(lumance, 0.333333);
vec3 smoothColor = centralColor + (centralColor-vec3(highpass))*alpha*0.1;</span>

原图rgb值与高反差后的结果相比,噪声越大,两者相减后的结果越大,在原结果基础上加上一定值,来提高亮度,消除噪声。
pow函数中第二个參数可调(1/3~1),值越小,alpha越大,磨皮效果越明显。改动该值可作为美颜程度


6.对混合后结果添加亮度:

7.以灰度值作为透明度将原图与混合后结果进行滤色、柔光等混合,并调节饱和度:

原图与结果图:


上面用图片来举样例,剩下的就是打开摄像头切换到前置自己看效果了~

代码地址:(将在晚些时候上传20160108日语)
下文地址中MagicCamera/MagicFilter/res/raw/文件夹下
beautify_fragment.glsl 与 beautify_vertex.glsl

另外:
----------------------------------------------------------------------------------------------------
MagicCamera地址

以GPUImage为基础,採用OpenGL+JNI开发,并优化了GPUImage预览图像处理过程,去除格式转换消耗的时间。提升效率

使用GLSL实现了40+种滤镜和实时美颜功能
实现了照片磨皮与美白功能
欢迎打开链接点击右上角Star

Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜的更多相关文章

  1. Android平台Camera实时滤镜实现方法探讨(三)--通过Shader实现YUV转换RBG

    http://blog.csdn.net/oshunz/article/details/50055057 文章例如该链接通过将YUV分成三个纹理,在shader中取出并且经过公式变换,转换成RGB.我 ...

  2. Android平台Camera实时滤镜实现方法探讨(十)--代码地址以及简单介绍(20160118更新)

    简单做了个相机和图片编辑模块,时间原因非常多功能还没有做.尚有BUG,见谅,将在以后抽时间改动 代码地址 PS:请点个Star^-^ --------------------------------- ...

  3. Android平台Camera实时滤镜实现方法探讨(九)--磨皮算法探讨(一)

    上一篇开头提到了一些可用于磨皮的去噪算法.以下我们实现这些算法而且观察效果,咱不考虑实时性的问题 本文首先探讨的首先是<基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用> 该 ...

  4. Unity3D之移植学习笔记:移植到Android平台

    首先,我们需要一台已经配置好可以开发Android应用的计算机,这里我使用的是Windows系统+Eclipse+ADT的开发环境,当然也可以使用Android Studio或者使用Mac系统都可以. ...

  5. Unity3D之移植学习笔记:移植到Android平台更好的方法

    接上文,之前我们采用了直接将Unity项目导出为Eclipse项目来修改的方式,这种做法存在的一个最大的问题就是:每当Unity被修改之后,都需要重新导出,而每次导出的项目在Android平台方面的J ...

  6. 随笔之Android平台上的进程调度探讨

    http://blog.csdn.net/innost/article/details/6940136 随笔之Android平台上的进程调度探讨 一由来 最近在翻阅MediaProvider的时候,突 ...

  7. 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...

  8. 【重要】U3D存放本地游戏存档——不同平台载入XML文件的方法——IOS MAC Android

    在PC上和IOS上读取XML文件的方式略有差别,经测试,IOS上不支持如下方法载入XML文件: XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load( ...

  9. (转)U3D不同平台载入XML文件的方法——IOS MAC Android

    自:http://www.cnblogs.com/sifenkesi/archive/2012/03/12/2391330.html 在PC上和IOS上读取XML文件的方式略有差别,经测试,IOS上不 ...

随机推荐

  1. 快速入门Matplotlib

    十分钟快速入门Matplotlib 函数式绘图 这个库主要有两种绘图方式,一种是像这样的类matlab的函数式绘图方法. import matplotlib.pyplot as plt import ...

  2. windows phone 网络开发三部曲(一)各种包的各种抓法

    首先感谢大家对我上一篇博客的支持,让我也体验了一把上榜的感觉. 这无疑是对我这个刚刚打算,认真写写博客的人的莫大的鼓励,再次感谢(鞠躬)!! 接下来想和大家分享一些关于windows phone网络开 ...

  3. 关于面试总结-app测试面试题

    前言 现在面试个测试岗位,都是要求全能的,web.接口.app啥都要会测,那么APP测试一般需要哪些技能呢? 面试app测试岗位会被问到哪些问题,怎样让面试管觉得你对APP测试很精通的样子? 本篇总结 ...

  4. Codeforces Round #417 (Div. 2) 花式被虐

    A. Sagheer and Crossroads time limit per test 1 second memory limit per test 256 megabytes input sta ...

  5. RocketMQ VS kafka

    转自:https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用MySQL作为消息存 ...

  6. [BZOJ4756] [Usaco2017 Jan]Promotion Counting(线段树合并)

    传送门 此题很有意思,有多种解法 1.用天天爱跑步的方法,进入子树的时候ans-query,出去子树的时候ans+query,query可以用树状数组或线段树来搞 2.按dfs序建立主席树 3.线段树 ...

  7. [HNOI2010]CHORUS 合唱队 (区间DP)

    题目描述 对于一个包含 NN 个整数的数列 AA ,我们可以把它的所有元素加入一个双头队列 BB . 首先 A1A1 作为队列的唯一元素,然后依次加入 A2∼ANA2∼AN ,如果 Ai<Ai− ...

  8. JCaptcha+Memcache的验证码集群实现

    一.问题背景 为了防止垃圾信息发布机器人的自动提交攻击,采用CAPTCHA验证码来保护该模块,提高攻击者的成本. 二.验证码简介 全自动区分计算机和人类的图灵测试(Completely Automat ...

  9. C Looooops(poj 2115)

    大致题意: 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束. 若在有限次内结束,则输出循环次数. 否则输出死循环. 解题思路: 题意不难理解,只是利用 ...

  10. 扰动法--*BZOJ3157: 国王奇遇记

    求$\sum_{i=1}^ni^mm^i$.$n \leq 1e9,m \leq 200$. 其实我也不知道这东西为啥叫“扰动法”,大概是在黑暗的边缘试探?就是那种,人家再多一点就被您看破了,然后您就 ...