本篇文章主要介绍了"Android平台Camera实时滤镜实现方法探讨八--简单美颜滤镜",主要涉及到滤镜方面的内容,对于移动开发感兴趣的同学可以参考一下:
美颜包含磨皮、美白、瘦脸等效果,其中磨皮算法在很多博客中均有介绍例如:双指数边缘平滑滤波器用于磨皮算法的尝试选择性模糊及其算法的实现基于局部均方差相关信息的图像...
美颜包含磨皮、美白、瘦脸等效果,其中磨皮算法在很多博客中均有介绍
例如:
双指数边缘平滑滤波器用于磨皮算法的尝试
选择性模糊及其算法的实现
基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用
导向滤波磨皮
递归双边滤波磨皮
以上博客均有相关代码/公式,经试验若选取合适参数均有不错的效果,可惜水平有限尚未在shader中实现不卡顿的实时效果~
观察美图秀秀和华为自带相机等相机APP,发现实时美颜效果均不如PC端和手机端后处理,可能在这一领域目前解决办法不多或者需求不高吧。
下面就探讨简单的美颜滤镜处理方法。
一.模糊处理
这里可以采用简单的高斯模糊或者双边滤波处理,可以简单参考GPUImage中的高斯模糊,或者可以将上述代码优化到可以实时执行的程度
二.将模糊后的图像灰度化
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);
这就是我们设置三个元素的向量,为我们的亮度来保存颜色比重的地方。这三个值加起来要为 1,这样我们才能把亮度计算为 0.0 - 1.0 之间的值。注意中间的值,就是表示绿色的值,用了 70% 的颜色比重,而蓝色只用了它的 10%。这是SONY Trinitron的数据,更加一般的系数是ITU HDTV标准 0.2125, 0.7154, 0.0721以及用于CRT显示器非线性色彩的0.299, 0.587, 0.114)。
lowp float luminance = dot(blurColor.rgb, luminanceWeighting);
使用 GLSL 中的点乘运算,计算出这个像素综合的亮度值。
lowp float satura = 0.7;
lowp vec3 greyScaleColor = vec3(luminance);
gl_FragColor = vec4(mix(greyScaleColor, textureColor.rgb, saturation), textureColor.w);
创建一个三个值都是亮度信息的 vec3,把所有的片段组合起来。为了确定每个新的颜色是什么,使用 mix 函数(mix(x, y, a): x, y的线性混叠, x(1-a) + y*a;)。mix 函数会把我们刚刚计算的灰度值和初始的纹理颜色以及我们得到的饱和度的信息相结合。
PS:以上代码可以在GPUImage中找到
三.美白映射
找到何时的颜色曲线即可对照片进行美白处理,例如这篇文章讨论了一些美白方法。PS水平高的同学这里可以自己设计出效果。下面是一个从某APP拿出来现成的映射表。将其作为纹理传递给片段着色器。