颜值即正义!随聊自拍美颜背后的算法故事

颜值即正义!随聊自拍美颜背后的算法故事

在图像处理领域,大家接触最多的算法加成应该就是手机里的美颜自拍了,除了有专用的美颜APP之外,很多手机的相机原生系统也都支持美颜功能,关于美颜的历史就不多说了,小胖今天就直接从算法的角度来做一些简单解读(考虑到很多朋友抱怨数学公式太多,那今天就不列公式,只谈结果吧)。

美颜按功能需求来看可分为基础、高级和附加功能三大块。基础概念就是磨皮、处理肤色,目前即便是原生系统自带的相机美颜也能做到基础美颜功能的实时计算,所以启动相机取景预览时就能看到,目前直播用的美颜摄像头已经可以实现高级功能的即时演算,比如祛痘、瘦脸、增大眼睛、五官立体等……此前翻车的某网红女主播就是在扭头瞬间人脸未被识别,现了不到1秒的原形但被吃瓜网友抓包,所以人脸识别是实现美颜,特别是实时美颜的第一前提。而年龄计算、AR装饰、美妆等就属于美颜之外(或之上)的另一类图像算法了。



美颜功能的基本构架就是这样,接下来就来一点一点地聊聊美颜算法的细节,首当其冲的自然是最重要的基本功能:磨皮。从算法的角度来看,磨皮是用滤波器将痘印、胎记、伤痕等高频信息给滤除,再用光滑皮肤灯领域低频信息进行填充。在种类繁多的高频滤波器里,适用于人像修复的主要都是带通滤波器,比如双边滤波、导向滤波、灰度图像各向异性扩散等,因为它们的特色是可以保留边缘信息,在磨皮的同时不会像高斯滤波那样让整张照片都模糊掉。

双边滤波其实小胖之前的文章也提到过,简单来说它是高斯滤波的衍生版,区别在于双边滤波在把像素空域距离纳入计算的同时,还考虑了像素值域之间差值的高斯系数,两个像素的值域差距越大,计算过程中的权重就越小,反之亦然,所以这个值域系数的作用就很关键。

对于完全从背景中抽离的人像来说,双边滤波磨皮很实用,但不足也比较明显,第一是一些面积较大的雀斑或胎记因为值域相差较大,就无法被磨皮操作简单平滑掉,很多时候就需要手动干预,在用户选取区域后以该区域中心为起点,选取一个包含但大于整个选取面积的矩形窗口并计算均值,再将整个均值融合到选取范围内,实现肤色自然过渡。

当然,也有自动检测的方法,但需要结合很精确的人脸识别,在皮肤区域采用模板匹配的方式,按水平/垂直方向进行扫描,因为雀斑、胎记等区域亮度值往往小于正常皮肤,从而实现自动判断。



双边滤波的第二个不足恰恰就是缺乏人脸区域计算机制,手机自拍不可能总是在纯色或大纵深的环境里,在能清晰辨别背景的情况下,双边滤波会对整张图像进行磨皮,这时候虽然皮肤磨得很光滑,边缘也比较清晰,但我们想要清晰呈现的背景细节也都跟着被磨掉了,照片严重失真(如上图)。所以磨皮的进阶就必须要先把人脸部分识别并抠出来,单独进行,关于人脸皮肤抠图算法的研究有很多,可以说是手机图像处理算法里最经典的主题了,所谓聚沙成塔,现在大多品牌自拍美颜的效果都相当不错也有它的一分功劳。

人脸抠图算法主要是利于肤色和纹理来进行识别一个相对准确的人脸范畴,因为皮肤区域的色彩即便是光照变化较大时,也会集中在一个相对较窄的区域内,抽取难度相对不大。当然也有很多公司采用机器学习模型参考,提高效率。



当得到人脸蒙版之后,将其与滤波结果进行混合,就能获得想要的磨皮效果,背景等其余区域还是使用原图,细节得以保留。

所以目前来说,人脸识别并抠图美颜功能的根基,磨皮之外的肤色处理也是类似的道理,比如很多妹子都喜欢用的美白效果,首先是用人脸皮肤抠图算法计算出需要处理的图像区域,然后将图像专为YUV或HSV等亮度色彩分离的颜色空间,然后提高亮度,减小色差,从而实现美白效果。

接下来聊聊瘦脸等高级算法,它的基础就是人脸检测和对齐。

人脸检测很好理解,对齐是啥意思?简单来说就是匹配具体五官、轮廓的位置,比较著名的算法有ASM、AAM等,当确定了五官位置和轮廓之后才有后面的瘦脸、眼睛放大、提高鼻梁等美颜功能。以瘦脸为例,在确定脸部轮廓后,计算美颜后图像中的每个像素在原图像中相应的位置,利用插值的方法计算实际像素的值,再回填到最终图像上来。眼睛增大是将人眼轮廓向外部扩张,并进行插值计算,缩小鼻子是将鼻子轮廓向中心移动,然后插值……



五官立体等进阶美颜操作是将眼部或鼻梁附近区域的像素变暗或调亮,形成阴影或高光区域,看上去更立体,事实上亮眼、美白牙齿等功能也是通过先定位需要改变的目标位置,再改变亮度、对比度和色差,从而实现最终效果。

美妆效果在当下美颜APP里也相当流行,主要是不涂口红、不抹眼影也能拍出漂亮的唇妆眼妆,确实方便。而美妆的基础也是人脸检测和对齐,只要找准了眉毛、眼线、脸颊、嘴唇等相应位置,将设计好的美妆效果对应像素映射就可搞定。不过,如何选取这些非规则的区域中的像素确实是个手艺活儿,第一种方案是根据五官的位置,计算这些像素的外接多边形,再利用扫描线方法,扫描每行位于多边形内部的像素,获得这些像素;另一种方案是预先设计像素区域的掩码,在具体的美妆计算中进行相应人脸轮廓关键点的匹配,消除由人脸大小、朝向不同造成的偏差。



与之类似的还有FaceU、B612等美颜APP里的AR效果,但因为是人脸实时跟踪和配准,因此算法要求其实很高。不过对于目前的手机SoC方案来说,一则可以用专用DSP,二则也可通过GPU进行计算,以目前骁龙845的性能来看,GPU搞定美颜实时算法轻轻松松,通用性有保证且并不比DSP费电。甚至像颜色滤镜功能,原本是通过OpenGL ES API将原始RGB实时转换为YUV或HSV,调整色调饱和度亮度后转回RGB,再交由GPU重新渲染,现在也能通过映射查找表的方式,直接将原始信息中的RGB映射到相应滤镜的RGB,更省时间,更重要的是还省电。

发布于 2018-05-31 21:39