OpenCV-Python实现人脸磨皮算法


Posted in Python onJune 07, 2021

人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果。

因为磨皮之后,脸部的杂质基本上就没有了,也可以说丢失了细节。那么肯定需要用到滤波函数。滤波的过程就是把图像的每一个像素值输入过滤器,得到平滑的图像。

而我们常用的滤波有均值滤波,高斯滤波以及双边滤波三种,到底选用那种滤波呢?

首先,均值滤波会因为是用周围像素的平均值代替原像素值,肯定会导致图像过于模糊,所以排除掉。其次,高斯滤波与均值滤波原理类似,只是高斯滤波器的模板系数会随着距离模板中心的增大而减小,虽然可以减弱图像的模糊程度,但是图像边缘信息会丢失。

那么,只剩一个滤波了,也就是双边滤波器。因为它同时综合了高通滤波器和a-截尾均值过滤器的叠加效果,即可以保证图像不是非常模糊,也可以保留图像边缘信息。

而人脸磨皮原理的步骤分为如下3个步骤:

  • 图像滤波
  • 图像融合
  • 图像锐化

因为,不管上面3种滤波如何,都会导致一定的模糊(只是相对来说谁更优而已),所以需要对图像进行融合与锐化的操作。这样,可以保留一些图像的细节,以增强图像的真实感。

其中,图像融合使用的函数就是cv2.addWeighted()图像加权函数。融合的是原图与双通滤波后的图像。

最后,图像锐化使用的PIL库进行操作,使用它的ImageEnhance.Sharpness()函数自动调节图像的锐度与对比度。

实现人脸磨皮效果

既然我们已经完全掌握了人脸磨皮的原理。下面,我们来直接实现人脸的磨皮效果,具体的代码如下所示:

# 人脸磨皮
def facial_dermabrasion_effect(fileName):
    img = cv2.imread(fileName)
    blur_img = cv2.bilateralFilter(img, 31, 75, 75)
    #图像融合
    result_img = cv2.addWeighted(img, 0.3, blur_img, 0.7, 0)
    cv2.imwrite("58_1.jpg", result_img)

    image = Image.open("58_1.jpg")
    # 锐度调节
    enh_img = ImageEnhance.Sharpness(image)
    image_sharped = enh_img.enhance(1.5)
    # 对比度调节
    con_img = ImageEnhance.Contrast(image_sharped)
    image_con = con_img.enhance(1.15)
    image_con.save("58_2.jpg")

    img1 = cv2.imread("58.jpg")
    img2 = cv2.imread("58_2.jpg")
    cv2.imshow("1", img1)
    cv2.imshow("2", img2)
    cv2.waitKey()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    facial_dermabrasion_effect("58.jpg")

运行之后,效果如下:

OpenCV-Python实现人脸磨皮算法

这段代码的参数都是可以调整的,并不是一层不变的,感兴趣的读者可以自己调节参数试试效果,当然人脸磨皮只是看起来皮肤光滑了。下面结合美白的效果,就可以实现相机的那种美颜。

到此这篇关于OpenCV-Python实现人脸磨皮算法的文章就介绍到这了,更多相关OpenCV 人脸磨皮内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
深入理解Python中变量赋值的问题
Jan 12 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
Jul 24 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
Python入门之后再看点什么好?
Mar 05 Python
Python 实现一行输入多个值的方法
Apr 21 Python
Python中常用的8种字符串操作方法
May 06 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
python简单实现插入排序实例代码
Dec 16 Python
python UIAutomator2使用超详细教程
Feb 19 Python
Python实现拼音转换
Python实现简繁体转换
在Python中如何使用yield
Jun 07 #Python
python 爬取天气网卫星图片
Python实现天气查询软件
Python字典和列表性能之间的比较
使用pycharm运行flask应用程序的详细教程
You might like
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
jquery ajax abort()的使用方法
2010/10/28 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
Python实现类继承实例
2014/07/04 Python
python time模块用法实例详解
2014/09/11 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
Python正则表达式学习小例子
2020/03/03 Python
Python 忽略文件名编码的方法
2020/08/01 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
九州传奇上机题
2014/07/10 面试题
房地产开发项目建议书
2014/05/16 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
《包身工》教学反思
2016/02/23 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android