磨皮美颜算法 附完整C代码
前言
2017年底时候写了这篇《集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序》
这也算是学习过程中比较有成就感的一个算法。
自2015年做算法开始到今天,还有个把月,就满五年了。
岁月匆匆,人生能有多少个五年。
这五年里,从音频图像到视频,从传统算法到深度学习,从2D到3D各种算法几乎都走了一个遍。
好在,不论在哪个领域都能有些许建树,这是博主我自身很欣慰的事情。
虽然有所间断但是仍然坚持写博客,并且坚持完整开源分享。
目的就是为了帮助那些一开始跟我一样,想要学习算法的萌新,
一起踏入算法领域去跟大家“排排坐,吃果果”。
引子
在这个特别的时间点,就想做点特别的事情。
那就是开源当时写的这个“美颜算法”,开源代码和当时的版本有些许出入,但是思路是一样的。
早些年的时候大家发现采用保边滤波的思路可以做到降噪,进而衍生出来针对皮肤的降噪,简称磨皮或者美颜。
从此百家争鸣,而这个课题到今天也还在发展,当然日新月异了。
故此,想谈谈针对美颜磨皮的一些算法思路,为后续想学习并改进的萌新提供一些养分。
概述美颜磨皮方法
1.基于保边降噪
这类算法有很多方法,但不外乎2种基础思路,
基于空间和基于频率,当然再展开的话,还可以细分为纹理和颜色。
例如通过肤色或纹理区域做针对性的处理。
这类算法的优点是计算简单,通用型强,但缺点就是不够细腻完美。
2.基于人脸检测贴图
这种严格意义上来说,是易容术,就是基于人脸检测出的关键数据。
例如人脸关键点,将人脸皮肤区域提取出来,重新贴上一张事先准备的皮肤图,进行皮肤贴合融合。
脸已经被置换了,效果很赞。有点缪修斯之船的味道。
这类算法优点是效果极其惊艳,但是算法复杂通用性差,一般只能针对少数角度表情的人脸。
3.结合1和2的深度学习方法
前两者的思路早期大行其道,如今到了数据时代,
基于深度学习的工具方案,可以非常好地结合前两者的思路,进行训练,求一个数据解。
很多人将深度学习等同于AI,这个做法有点激进。
基于深度学习的做法,仍然存在前两者一样的问题,简单的不够细腻,细腻的不够简单,
而如果要设计一个优秀的模型,其实跟设计一个传统算法一样困难。
基于数据驱动的算法,验证成本非常高,可控性比较差,当然在金钱的驱动下确实能产出还不错的算法模型。
这类算法的优点,往往能求出很不错的局部最优解,甚至以假乱真,缺点就是需要大量金钱和数据的驱动。
总结来说的话,不付出代价,就别想有好的结果,非常的现实。
据我所知目前使用最多的方案是第一种和第三种,第二种可操作性不强,只有少数公司掌握了这方面的核心技术。
但是不管是哪种方案,无非就是以下几个步骤。
1.确定人脸的皮肤区域
2.定位人脸的杂质(痘痘,斑点,痣,肤色不均等)
3.根据定位到杂质进行填补修复或滤除
这就是图像处理经典三部曲
1.定位 2.检测 3.处理
每一个细分展开,都非常宏大且复杂的算法。
以上,仅以磨皮美颜为例子,阐述图像方面的算法想要或正在解决什么样的问题。
我们在工作中碰到的图像问题无非以上几个核心问题,问题都是类似的,只是不同场景和需求下各有难处。
本次开源的算法思路
本次开源的算法是基于保边降噪的思路,
当然这个思路可以通过改写,参数化后可以集成到深度学习中,作为一个先验层辅助训练。
算法步骤如下:
1. 检测皮肤颜色,确定皮肤占图像的比率
2. 根据皮肤比率进行边缘检测,产出细节映射图
3. 基于细节映射图和磨皮强度进行保边降噪
4. 对降噪好的图进行再一次肤色检测,保留肤色区域的降噪,其他区域还原为原图
步骤比较简单,但是要同时兼顾效果性能,是很不容易的。
当然这个算法肤色检测那一部分可以采用深度学习“语义分割”方面的思路进而改进效果。
做得好,将本算法改良到准商用,惊艳的程度是没有问题的。
深度学习相关技术就不展开细说了,有能力的朋友,感兴趣的话,可以自行实操。
完整源代码开源地址:
https://github.com/cpuimage/skin_smoothing
项目没有第三方依赖,完整纯c代码。
有编译问题的同学自行参考《Windows下C,C++开发环境搭建指南》搭建编译环境。
附上算法效果的示例:


以上,权当抛砖引玉之用。
授人以鱼不如授人以渔。
2020年,疫情之下,
愿大家都能事业有成,身体健康。
世界和平,人们皆友爱。
若有其他相关问题或者需求也可以邮件联系俺探讨。
邮箱地址是: gaozhihan@vip.qq.com
磨皮美颜算法 附完整C代码的更多相关文章
- 音频降噪算法 附完整C代码
降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...
- mser 最大稳定极值区域(文字区域定位)算法 附完整C代码
mser 的全称:Maximally Stable Extremal Regions 第一次听说这个算法时,是来自当时部门的一个同事, 提及到他的项目用它来做文字区域的定位,对这个算法做了一些优化. ...
- 基于RNN的音频降噪算法 (附完整C代码)
前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...
- 音频自动增益 与 静音检测 算法 附完整C代码
前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...
- 音频自动增益 与 静音检测 算法 附完整C代码【转】
转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用 ...
- 自动曝光修复算法 附完整C代码
众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了 ...
- 基于傅里叶变换的音频重采样算法 (附完整c代码)
前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...
- 图片文档倾斜矫正算法 附完整c代码
2年前在学习图像算法的时候看到一个文档倾斜矫正的算法. 也就是说能将一些文档图像进行旋转矫正, 当然这个算法一般用于一些文档扫描软件做后处理 或者用于ocr 文字识别做前处理. 相关的关键词: 抗倾斜 ...
- 3D Lut 电影级调色算法 附完整C代码
在前面的文章,我提到过VSCO Cam 的胶片滤镜算法实现是3d lut. 那么3d lut 到底是个什么东西呢? 或者说它是用来做什么的? 长话短说,3d lut(全称 : 3D Lookup t ...
随机推荐
- 【C++】赋值过程中类型转换
注意:以下内容摘自文献[1],修改了部分内容. 1.赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时自动进行类型转换. (1) 将浮点型数据(包括单.双精度)赋给 ...
- [PHP自动化-进阶]002.CURL模拟登录带有验证码的网站
引言:继前文<模拟登录并采集数据>,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录. 这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登录的方法,可以帮助读者 ...
- Object类及其equals()方法
== : 1.基本数据类型:根据基本数据类型的值判断是否相等,相等返回true,反之返回false 注意:两端数据类型可以不同, 在不同的情况下,也可以返回true 2.引用数据类型:Object ...
- StackOverflow 创始人关于如何高效编程的清单.md
这是 StackOverflow 联合创始人 Jeff Atwood 注释的十戒.程序员普遍有很强的自尊心,都应该看看本文,打印下来时刻提醒自己. "无我编程"发生在开发阶段,表现 ...
- STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载
//为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 //************************** //程序说明:stc ...
- Java实现 LeetCode 810 黑板异或游戏 (分析)
810. 黑板异或游戏 一个黑板上写着一个非负整数数组 nums[i] .小红和小明轮流从黑板上擦掉一个数字,小红先手.如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家 ...
- Java实现 LeetCode 785 判断二分图(分析题)
785. 判断二分图 给定一个无向图graph,当这个图为二分图时返回true. 如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我 ...
- Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)
小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...
- Java实现第九届蓝桥杯堆的计数
堆的计数 题目描述 我们知道包含N个元素的堆可以看成是一棵包含N个节点的完全二叉树. 每个节点有一个权值.对于小根堆来说,父节点的权值一定小于其子节点的权值. 假设N个节点的权值分别是1~N,你能求出 ...
- java实现第七届蓝桥杯骰子游戏
骰子游戏 PS: 骰子哪有从0开始的只能是1-6,而他i j k的范围都是0-5,所以都要加1 题目描述 我们来玩一个游戏. 同时掷出3个普通骰子(6个面上的数字分别是1~6). 如果其中一个骰子上的 ...