终端图像处理实践实时唇彩效果优化

德国强力白蚀消 https://m-mip.39.net/disease/mip_9338515.html

作者简介:atilazhang(张子鋆),天天P图iOS工程师

使用常规的三角贴合的方式给唇部上色,在大多数情况下都表现良好。但是在唇部形态较之正常形态发生较大变化时,比如在嘟嘴,张嘴与抿嘴的场景下唇彩的贴合程度就会降低许多,如下图所示,

图1(嘟嘴)

图2(张嘴)

图3(抿嘴)

于是我们尝试使用LUT+唇部mask的滤镜技术对唇部区域进行色彩变换来实现各种唇彩的效果。根据这样的实现思路,我们设计实现了MCLipFiltr来尝试解决所遇到的唇彩贴合不准的问题。

我们先来看一下MCLipFiltr的整体结构与流程图,

图4(整体结构流程图)

下面具体来看一下MCLipFiltr的实现,

MCLipFiltr的fragmntshadr中定义了3张纹理,inputImagTxtur指向相机采集的画面帧;inputImagTxtur2指向颜色变换查询表LUT,inputImagTxtur3指向画面帧对应的唇部区域mask;inputImagTxtur3通过inputImagTxtur及其对应的人脸特征点由CPU计算获得。另外strngth用来调节唇彩效果的强弱。

来看一下MCLipFiltr的类声明,

其中vrtxSamplingCoordinats用来指向唇部mask对应的内存区域,prviousInputTxturSiz用来跟踪记录前一帧的大小,当发生变化时,重新为vrtxSamplingCoordinats分配对应的内存空间。

MCLipFiltr继承自GPUImagFiltr,我们来看一下它的rndrToTxturWithVrtics:txturCoordinats:方法,

首先如果没有人脸,LipFiltr不工作,

然后创建合适的内存空间,读入画面帧。这里因为拍照时(相对于预览来说)会使用较高的分辨率,inputTxturSiz大小发生了变化,所以我们需要对处理纹理的大小进行追踪,变化时重新分配。

然后是必要的初始化工作

然后再逐人脸地拼装人脸特征点数据,由于人脸检测器会在一张rsiz到较小分辨率的图片下进行人脸检测以缩减人脸检测的耗时,所以在这里我们需要把坐标重新映射到当前输入纹理的测度。

切分出图像中的嘴唇区域送到第2号纹理中,并设定混合强度。

激活所需的帧缓冲,进行绘制。

其中分割出嘴唇区域mask的sgmntLipsFast_multipl函数运行在CPU上,是比较重要的过程。下面介绍一下它的工作原理。

在研究领域,对于嘴唇分割的问题已经有了广泛的研究成果。概括起来讲,主要有以下两大类方法。

第一大类方法在颜色空间上使用颜色变换或者颜色滤镜来增大嘴唇和皮肤的颜色差异,从而进行嘴唇分割,这类方法的弊端是会有许多斑块散布在分割结果上。

第二大类方法是模糊聚类方法,其中比较经典的是fuzzyc-mans(FCM)算法,后来提出的fuzzyc-manswithshapfunction(FCMS)算法在颜色信息的基础上进一步利用了空间位置信息,在FCM算法的基础上加上了轮廓函数,轮廓函数在目标函数中起到相异度度量的作用,使得那些具有相似颜色信息但是处在不同区域的像素可以被清晰地区分。为了达成这个目标,一个聚类的轮廓函数的设计需要满足,对于这个聚类内部的像素有一个较小的值,对于这个聚类外部的其他像素有一个较大的值。

我们来看一下FCMS中相异度度量的设计,假设I是N*M的图像,由X={x1,1,…,xr,s,…,xN,M}表示,其中,是一个q维的颜色向量,用来表达位置(r,s)上的像素。di,r,s表示特征向量xr,s到第i个聚类中心vi的欧式距离,xr,s和vi的相异度度量定义为,

,其中定义了色彩相异性,

定义了空间距离相异性,它描述了点(r,s)到椭圆p={xc,yc,w,h,θ}的距离,椭圆内部的点小于1,椭圆外部的点大于1。(xc,yc)是椭圆的中心,w,h分别是椭圆的长短轴,θ是椭圆的倾角,这里引入椭圆方程主要是因为嘴唇的轮廓近似椭圆。α是调节两者权重的权重因子。累加所有像素对所有聚类的相异度度量,目标最小,求得的聚类中心和mask即是对唇部分割问题的最优解。

图5(人脸特征点)

sgmntLipsFast_multipl利用了FCMS的唇部分割技术,并对该技术进行了改良。它的计算能力由CPU提供,基于模糊聚类方法,由于人脸分析器会对每一帧画面进行人脸分析,而分析所得的人脸特征点可以用来圈定一个初始的唇部区域,这比FCMS中的椭圆轮廓更加准确,可以为我们提供一个更好的初始聚类划分,如图3所示,设以P65,P66为左右端点,以P35,P69为上下端点的矩形为唇部相关区域S,依次以顶点P65,P67,P68,P69,P70,P71,P66,P72,P73,P74,P65,P82,P81,P80,P66,P79,P78,P77,P76,P75,P65为路径圈出的区域为初始唇部区域C1,初始非唇部区域C2=S–C1,以C1,C2中特征向量的均值作为它们各自的聚类中心V1,V2,迭代遍历S中所有特征向量,分别计算它们到聚类中心V1,V2的欧式距离,根据距离远近重新归类特征点,重新计算新的聚类中心,直到每个聚类中心都不再发生变化。迭代停止时,C1中的特征点就是唇部区域的一个更加精准的分割。分割算法可以形式化地描述为以下伪码,

使用常规的三角贴合的方式给唇部上色,在大多数情况下都表现良好。但是在唇部形态较之正常形态发生较大变化时效果欠佳。本文使用的实时唇彩技术,解决了上述问题。基于GPU的三角划分与贴合只利用了图像的空间位置信息,然而唇部区域提取的问题是可以通过唇部本身的色彩信息较为有效地解决的,这主要得益于唇部区域的颜色与其周边的肤色有明显的差异,这为唇部区域图像的分割提供了有利条件。文章使用的方法结合了图像的空间位置信息和色彩信息,解决了用户反馈的问题。

作者简介:atilazhang(张子鋆),天天P图iOS工程师

文章后记:天天P图是由腾讯公司开发的业内领先的图像处理,相机美拍的APP。欢迎扫码或搜索

转载请注明:http://www.enuoxiaoman.com/zzkh/15135.html

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 网站简介| 发布优势| 服务条款| 隐私保护| 广告合作| 网站地图| 版权申明

    当前时间: