前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >终端图像处理实践-实时唇彩效果优化

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

作者头像
天天P图攻城狮
发布于 2018-07-12 10:23:56
发布于 2018-07-12 10:23:56
2.1K0
举报
文章被收录于专栏:天天P图攻城狮天天P图攻城狮

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

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

图1(嘟嘴)

图2(张嘴)

图3(抿嘴)

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

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

图4(整体结构流程图)

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

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

来看一下MCLipFilter的类声明,

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

   MCLipFilter继承自GPUImageFilter, 我们来看一下它的renderToTextureWithVertices:textureCoordinates:方法,

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

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

然后是必要的初始化工作

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

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

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

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

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

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

第二大类方法是模糊聚类方法,其中比较经典的是fuzzy c-means(FCM)算法,后来提出的fuzzy c-means with shape function(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(人脸特征点)

segmentLipsFast_multiple利用了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。欢迎扫码或搜索关注我们的微信公众号:“天天P图攻城狮”,那上面将陆续公开分享我们的技术实践,期待一起交流学习! 加入我们: 天天P图技术团队长期招聘:(1) 图像处理算法工程师,(2) Android / iOS 开发工程师,期待对我们感兴趣或者有推荐的技术牛人加入我们(base 上海)!联系方式:ttpic_dev@qq.com

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 天天P图攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从 ESLint 开始,说透我如何在团队项目中基于 Vue 做代码校验
最近遇到了一个老项目,比较有意思的是这个项目集前后端的代码于一起,而后端也会去修改前端代码,所以就出现了后端用 IntelliJ IDEA 来开发前端项目,而前端用 VSCode 来开发前端项目的情况。于是乎,出现了代码规范的问题,所以就有了这篇文章,整理了一下前端代码校验以及在 Vue 项目中的实践。
用户4456933
2021/07/12
2.5K0
从 ESLint 开始,说透我如何在团队项目中基于 Vue 做代码校验
15分钟快速配置eslint,prettier,lint-staged,husky,commitizen实现前端项目代码规范化
当前,前端项目支持代码规范校验、代码格式化已经必不可少,同时需要支持代码提交前对代码格式校验预检查,这里提供一份最简单的配置供大家参考。
蓓蕾心晴
2022/05/09
4.8K2
15分钟快速配置eslint,prettier,lint-staged,husky,commitizen实现前端项目代码规范化
eslint+prettier学习
配置文件可以从基本配置扩展启用的规则集,不添加则不会继承任何扩展集,仅按照rules下的基本配置来执行。
蓓蕾心晴
2020/09/24
2.2K0
小程序开发格式化代码ESLint、Prettier、husky、lint-stage
依赖 yarn init yarn add --dev babel-eslint@10.0.3 yarn add --dev eslint@6.7.1 yarn add --dev eslint-config-alloy@3.7.1 yarn add --dev eslint-config-prettier@6.10.0 yarn add --dev eslint-plugin-prettier@3.1.4 yarn add --dev prettier@2.0.5 yarn add --dev prett
kif
2023/02/27
2.6K0
【JS】308- 深入理解ESLint
小沈是一个刚刚开始工作的前端实习生,第一次进行团队开发,难免有些紧张。在导师的安排下,拿到了项目的 git 权限,开始进行 clone。
pingan8787
2019/08/06
1.3K0
前端科普系列(5):ESLint - 守住优雅的护城河
【前端科普系列】帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作。尽可能的写成科普类文章,对于前端开发而言,只适合刚入门的新手。
2020labs小助手
2020/10/28
2.5K0
Eslint配置
开发的过程中不同的编辑器,不同的格式化插件对应的代码格式都有差异,这就导致代码风格不一致或是合并冲突。
码客说
2022/09/19
2.9K0
Eslint配置
【TypeScript】014-工程相关
2019 年 1 月,TypeScirpt 官方决定全面采用 ESLint 作为代码检查的工具,并创建了一个新项目 typescript-eslint,提供了 TypeScript 文件的解析器 @typescript-eslint/parser 和相关的配置选项 @typescript-eslint/eslint-plugin 等。而之前的两个 lint 解决方案都将弃用:
訾博ZiBo
2025/01/06
2360
Eslint该如何配置?Eslint使用以及相关配置说明
Eslint在过往接触过的很多开源项目内都有它的身影,习惯一个人写代码了,总觉得它可有可无,但是归根结底,好处还是很多的。
房东的狗丶
2023/02/17
3.7K0
Eslint该如何配置?Eslint使用以及相关配置说明
Eslint使用入门指南
ESLint最初是由Nicholas C. Zakas 于2013年6月创建的开源项目。它的目标是提供一个插件化的javascript代码检测工具。
Snine
2022/02/21
2.2K0
emo——给项目配置prettier,eslint,husky加强协作规范
给自己的一个初始化项目配置一些规范; Prettier - Code formatter: Prettier - Code formatter ESLint: ESLint Git gitignore: https://git-scm.com/docs/gitignore#_pattern_format
思索
2024/08/15
1190
emo——给项目配置prettier,eslint,husky加强协作规范
制定自己团队的前端开发规范之 eslint
为了大家方便,我将之前长长的 eslint 进行了更换,因为时间原因和使用方面的原因,没将自己的 eslint 上传成 eslint-config,直接使用腾讯的 eslint-config-alloy。
石燕平
2019/12/03
1.7K0
深度讲解TS:这样学TS,迟早进大厂【21】:代码检查
初学者玩转 TypeScript系列,总计 21 期,点赞、收藏、评论、关注、三连支持! TS系列地址: 21篇文章带你玩转ts
江一铭
2022/09/08
2.7K0
ESLint 配置入门
ESLint 是一款检查 JavaScript 程序是否符合特定的规则的工具。比如字符串用单引号还是双引号,tab 缩进用 2 个空格还是 4 个空格还是其他,这些都可以用 ESLint 来规定。
前端西瓜哥
2022/12/21
1.6K0
ESLint 配置入门
ESLint静态代码检查
ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查,就不会因为某个字段未定义为undefined或null这样的错误而导致服务崩溃,可以有效的控制项目代码的质量。
xiangzhihong
2022/11/30
2.2K0
给 eslint 写一个插件
eslint 是非常有名的 linter,地球上每一个 JavaScript 程序员都应该知道。
疯狂的技术宅
2020/12/15
8930
ES Lint 在 React Natvie 项目的应用
1,在开始之前,首先看下官网及资料 官网: https://eslint.org/ 官方 Getting Started [https://eslint.org/docs/user-guide/getting-started](https://eslint.org/docs/user- guide/getting-started) 官方规则说明 https://eslint.org/docs/rules/ 配置rule 说明 https://blog.csdn.net/Cy_Shay/article/details/78217381
张云飞Vir
2020/03/16
5650
使用eslint + prettier + husky + lint-staged 约束项目的最佳实践!
大家好,我是HoMeTown,最近在搭建一个公司与某一线大厂有合作,需要做一个性能极其优化的微信小程序,我们组正好刚从企微项目里抽出身来,所以这个艰巨的任务就交给我们来完成了,首先开了一天会,跟合作方的前端经理PM 确定好了技术选型以及规范,分工细则下来以后,得到项目架构&少许业务开发的任务,优化交给合作方去做,因此这个项目会有很多人参与进来,一个强有力的项目约束是十分重要的!
HoMeTown
2022/10/26
1.9K0
使用eslint + prettier + husky + lint-staged 约束项目的最佳实践!
webpack-dev-server使用报错
参考 https://stackoverflow.com/questions/57724011/how-to-fix-cannot-find-module-webpack-bin-config-yargs
用户6379025
2022/12/26
5010
项目eslint从零到一
eslint在项目里并不太陌生,通常在使用脚手架时,会默认让你安装执行的eslint,当公司项目比较规范时,常常会配置组内统一的eslint规则,eslint帮助我们在开发阶段检查代码是否符合标准规范,统一了我们组内不同项目代码风格,也可以帮助我们养成良好的代码习惯,统一eslint对于项目的可维护性必不可少,今天我们一起学习一下如果改进你项目的规范。
Maic
2022/07/28
1.6K0
项目eslint从零到一
推荐阅读
相关推荐
从 ESLint 开始,说透我如何在团队项目中基于 Vue 做代码校验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档