你每天在朋友圈里会看到无数的朋友自拍,可是这些朋友的照片和你现实认识的他/她长相差距很大,皮肤完美无瑕,各个都是小尖脸,不知道各位看官是否想过,这个到底是如何实现呢?
我们全世界每天都有数亿张自拍(Selfies)产生。在2013年11月,Selfie被收录到《牛津英语词典》。研究机构发现36%的自拍者承认他们会在拍完照的第一时间美化照片,而13%的人修图时几乎不放过任何一张自拍。(这研究机构一定是外国的吧,在中国我估计得超过90%)那么我们实现美颜,就要提到图像处理技术,首先人脸识别是美颜模块中核心技术,人脸识别的准确与否直接决定了美颜应用的效果,其中影响最大的便是美妆功能模块,只有对人体面部以及五官进行精准定位才能呈现出自然融合的妆容。
要理解图像识别,我们首先把一张图像看作是一个二维的数据集合,其中每个元素都是一个像素点。如果将这些数据用几何的方式来呈现出来,“痘”就是和周围点差异较大的点。在图像处理领域,这个差异是通过灰度值来衡量的灰度,也叫“亮度”。灰度图,也就是黑白图。将彩色图转换为灰度图,图像的关键特征不会丢失。
这么说可能会有点晦涩,我们用简单一点的话阐述:原图首先经过磨皮处理,也就是把痘、斑这些消除掉。磨皮的本质实际上是模糊。而在图像处理领域,模糊就是将像素点的取值与周边的像素点取值相关联。然后把经过磨皮的图片与原图进行混合。混合这个步骤是不可缺少的,因为如果只用磨皮后的图,很容易丢失细节。而且把两张图混合,还可以通过调整两个图的混合权重,来控制磨皮的程度,达成不同级别的磨皮效果。剩下的一步就是美肤,比如把皮肤肤色调得白一点、红嫩一点,或者一些特殊的需求都可以实现。基本上大部分的美颜,都是这样的流程。
为什么是这样的流程呢,事实上,人的眼睛在观察物体时,首先注意的是物体的边缘。而在一张图像里面,边缘,即与周边灰度差异较大的点。类似的,“痘”也是与周边点的灰度差异较大的点。相比色彩,人的眼睛对灰度更敏感。这也是为什么对视频进行压缩的时候,会偏向于丢弃色彩部分的数据,而尽量保留亮度数据。比如脸上有个痘,这个痘自然产生一个灰度值的变化,从抽象意义上说就是一个噪点。所以美颜磨皮的算法,核心是去噪。
那么更加难以自动判断的该怎么处理呢?比如黑痣,皱纹这些有棱角快速变化的都有丰富的高频分量,用数字方法滤去高频分量就可以是图片看起来更圆润,斑点变少,光滑细腻。
刚才我们只是说了照片的自动美颜,如果是现在各类直播平台的实时美颜会怎么样?这个技术上就更加先进了,实时显示的图片是经过磨皮加美白的,不是原始视频数据,这时并没有涉及到人脸检测相关的算法,拍摄后的会经过人脸检测并根据人脸做一些处理,比如轻微的瘦脸。而保存的原图是摄像头里的原始数据,是没有经过美颜处理的。实时的美颜处理需要使用GPU加速,CPU性能无法做到实时处理。
直播美颜用的主流技术是OpenGL ES。它的好处首先是直接在GPU上运行的,所以性能高、功耗小,用在直播上比较划算。第二,它是跨平台的,iOS和安卓都支持,美颜效果能够直接在这两个平台上达到跨平台的效果。
美颜技术如果深入去讲,属于一个学科了,如果美颜1.0只是化妆的话,美颜2.0基本就能达到整容的效果——把眼睛变大,把圆脸变成瓜子脸。文章开头我们提到了实现这一效果的基础就是人脸识别。只有确定了有没有人脸,知道了五官在什么位置,我们才能把它们“整”的更漂亮。
现在你知道自动美颜是如何实现的吗?
热门跟贴