现在各大手机制造商都在主推美颜效果,各种前后4000万像素,照亮你的美,各种逆光也清晰。其实这些看似神秘的美颜效果,除了依赖于手机像素之外,更重要的是攻城狮们对于美颜算法的构造。除了这些手机供应商,各大拍照软件比如B612,faceu也必然会有美颜效果,紧随其后的是各大直播平台,没有美颜效果,网红都不愿意去平台直播啦
那么这些美颜算法很难吗?只有大牛们能解决吗?答案是,很难。好的美颜算法确实很难,需要经过很多算法工程师的优化,重构,经过用户的千锤百炼,不断进步而成。但是,小编要说的是,如果各位有兴趣,简单的美颜算法还是OK的,稍微懂点图像处理的还是可以做实时美颜效果,下面我们就聊一聊如何来进行美颜效果的实现。
美颜大致上可以分为两块:美白和磨皮。如果玩过Photoshop的都知道其实美颜其实就是四大步:1.用具有保边效果的滤波算法对图像进行模糊处理。2.用肤色检测算法保护非皮肤区域。3.将模糊后的图像和原图进行图像融合。4.对融合后的图像进行锐化处理。
对于步骤1,滤波算法可以选择双边滤波,导向滤波,表面模糊等,只要能保边缘就行,有人说高斯模糊是不行的,但事实上只做美白是可以的,高斯模糊没办法实现磨皮效果。如果单单使用高斯模糊来磨皮,得到的效果是不尽人意的。原因在于,高斯模糊只考虑了像素间的距离关系,没有考虑到像素值本身之间的差异。举个例子来讲,头发与人脸分界处(颜色差异很大,黑色与人皮肤的颜色),如果采用高斯模糊则这个边缘也会模糊掉,这显然不是我们希望看到的。而双边滤波(Bilateral Filter) 则考虑到了颜色的差异,它的像素点取值也是周边像素点的加权平均,而且权重也是高斯函数。不同的是,这个权重不仅与像素间距离有关,还与像素值本身的差异有关,具体讲是,像素值差异越小,权重越大,也是这个特性让它具有了保持边缘的特性,因此它是一个很好的磨皮工具。这里以双边滤波为例。取出绿色通道,对绿色通道进行高斯模糊,得到模糊后的值sampleColor。再用原图绿色通道值减去sampleColor,加上0.5(即128),这两个步骤即PS中的高反差保留。
vec3 centralColor = texture2D(inputImageTexture, textureCoordinate).rgb;
float highpass = centralColor.g - sampleColor + 0.5;
再对上述结果值进行3-5次强光处理,此步骤可以使得噪声更加突出
if(color <= 0.5){
color = color * color * 2.0;
}else{
color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
}
这样经过这些步骤得到如下图片:
计算原图的灰度值,公式为0.299*R + 0.587*G + 0.114*B得到灰度图片之后,将灰度值作为阈值,用来排除非皮肤部分,根据灰度值计算,将原图与结果图合成。
float alpha = pow(lumance, 0.333333);
vec3 smoothColor = centralColor + (centralColor-vec3(highpass))*alpha*0.1;</span>
原图rgb值与高反差后的结果相比,噪声越大,两者相减后的结果越大,在原结果基础上加上一定值,来提高亮度,消除噪声。
pow函数中第二个参数可调(1/3~1),值越小,alpha越大,磨皮效果越明显,修改该值可作为美颜程度。
并对混合后结果增加亮度,调整饱和度等参数得到最终图:
我们可以看下原图和美颜后的图对比:
下图为原图,上图为磨皮效果示意图
以上就是最简单的美白磨皮效果实现啦。
个开源美颜相机:美颜相机,具有人脸检测、磨皮美白人脸、滤镜、调节图片、摄像功能。