美颜磨皮算法需要解决的问题是,输入一张人像图片。算法将人像皮肤的粗糙、斑痘、衰老皱纹等进行消除处理,是皮肤光滑显年轻,同时要保持自然感,避免修图痕迹过重。以这个目标为出发,可以将美颜磨皮拆解为以下任务。
识别出需要涂抹光滑的区域
这一步骤解决的是磨哪里, 人像磨皮没必要对整张图片画面进行处理,需要识别出需要磨皮的人像皮肤区域,常规来说有以下的处理方法。
传统皮肤检测算法
基于hsv、rgb和yuv等颜色空间都有对应的皮肤检测算法,原理非常简单。主要是通过分析皮肤区域在这些颜色空间下的分量通道灰度值分布情况,再基于统计的分布情况做阈值分割。这种方法主要有以下优缺点:
-
优点
- 原理简单,实现起来成本低。
- 计算量小,性能开销比较低
-
缺点
- 算法通用性不足,难以适配不同人种肤色
- 误识别率比较高,难以适应光照变化的场景
深度学习皮肤分割
这种方法比较彻底,类似FCN的实例分割,借助深度学习的端到端的像素语义理解,将皮肤区域的像素点进行分类,从而直接提取皮肤区域。这种方法优缺点如下:
- 优点
- 算法通用性比较强,方便适配不同人种肤色
- 分割识别效果好,基本可以精准分割出皮肤与其他区域的边缘
- 缺点
- 计算量较大,性能开销比较高。
人脸检测
还有一种方法是基于人脸检测的,磨皮算法一般关注人脸面部的磨皮处理。因此基于人脸关键点检测,可以准确识别出人脸的区域。这种方法的优缺点为:
- 优点
- 性能相比基于深度学习的皮肤分割要好,对性能要求比较低。目前主流的商用106点人脸检测,在手机端侧可以做到10ms以内的性能水平。
- 基于人脸特征点方案可以很好地区分面部五官,可以基于面部五官分别做不同的磨皮策略,更好的保护五官细节,保持真实感。
- 缺点
- 无法识别人脸面部以外的皮肤区域,美颜磨皮仅限于人脸的面部区域。
涂抹处理
解决完磨哪里的问题后,下一步要解决怎么磨的问题。这一步为关键的磨皮处理,所谓磨皮,在图像上看来是需要将皮肤表面给涂抹光滑,而这个处理对应了图像处理中常见的滤波处理。磨皮处理是希望输出变得更平滑光滑的,所以一般采用低通滤波去降噪。常用的磨皮滤波算法有一下几种:
- 均值滤波:
简单粗暴的领域平均处理,优点是原理简单计算量小,实现成本和性能要求都很低。缺点是涂抹感太严重,磨皮后的不真实感太严重。
- 高斯滤波:
在均值滤波多了一个正态分布系数的加权平均,不再是领域的直接平均。原理上更符合噪声的剔除极致,优点是相比均值滤波对于边缘细节的保留做得更好一些,缺点是计算量也上来了。耗时相比均值滤波提升不少,在硬件性能还不是很高的时期高斯滤波层被采用做磨皮的主要处理方法。
- 双边滤波
在高斯滤波的基础上,双边滤波更仅一步。在像素点空间领域加强平均的基础上,叠加了一个像素点色彩灰度值的正态分布加权平均。凭此处理双边滤波相比高斯滤波取得了更好保留细节的能力,因此双边滤波也往往被称为保边滤波。代价则是增加了一倍的计算量,耗时比较大。往往需要较高的cpu性能,或者直接将算法实现在gpu才可以保证处理速度达到要求。另外,双边滤波有时候正是因为保边能力太好了,也会导致有些场景磨皮效果不明显。
保护五官&皮肤纹理
磨皮功能实现了,接下来的目标是要解决做得好的问题。怎么理解磨皮效果做得好,非常简单。从用户视角出发,即想要把皮肤变得光滑显年轻,又想别人看不出来照片是后期处理过的。这个问题转化为工程问题就是在模糊处理的同时要保留五官皮肤细节,保留五官细节通常有以下几种做法:
- 高反差保留
这个是photoshop中常用的磨皮优化方法,其原理为
|
|
算法公式比较容易理解,模糊处理后的图像主要是去除了高频部分信息,而使用原始图像减去模糊图像自然得到的就是包含五官边缘信息,加上127的原因是为了放大这部分的信息使其不容易丢失。其中高斯模糊部分可以换成双边滤波处理,效果会更好。经过高反差处理,获取的结果就是五官的纹理细节。在磨皮最后与磨皮后的图像混合处理,则可以有效地还原原图的皮肤五官细节。
- 锐化
高反差处理实际上也算一种图像细节增强处理,而常用的锐化算法也是一种增强算法。甚至很多锐化算法的实现思路和高反差保留的思路非常像,比如usm锐化算法:
|
|
其中w表示权重(0.1~0.9),默认为0.6。图像像素点灰度值为0-1范围。
考虑好以上的问题和做好这些处理,基本上就可以实现一个不错的美颜磨皮了。今天先总结理论,后续再分享具体的实现。