OpenCV-Python实现人脸磨皮算法
作者:一天一篇Python库 发布时间:2022-12-29 18:00:06
人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果。
因为磨皮之后,脸部的杂质基本上就没有了,也可以说丢失了细节。那么肯定需要用到滤波函数。滤波的过程就是把图像的每一个像素值输入过滤器,得到平滑的图像。
而我们常用的滤波有均值滤波,高斯滤波以及双边滤波三种,到底选用那种滤波呢?
首先,均值滤波会因为是用周围像素的平均值代替原像素值,肯定会导致图像过于模糊,所以排除掉。其次,高斯滤波与均值滤波原理类似,只是高斯滤波器的模板系数会随着距离模板中心的增大而减小,虽然可以减弱图像的模糊程度,但是图像边缘信息会丢失。
那么,只剩一个滤波了,也就是双边滤波器。因为它同时综合了高通滤波器和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")
运行之后,效果如下:
这段代码的参数都是可以调整的,并不是一层不变的,感兴趣的读者可以自己调节参数试试效果,当然人脸磨皮只是看起来皮肤光滑了。下面结合美白的效果,就可以实现相机的那种美颜。
来源:https://liyuanjinglyj.blog.csdn.net/article/details/115299189
猜你喜欢
- 发现个很有用的方法——predict_proba今天在做数据预测的时候用到了,感觉很不错,所以记录分享一下,以后可能会经常用到。我的理解:p
- 一、概述:Oracle的注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可
- 一、Browser Capabilities组件 该组件最主要的作用是:提取识别客户端浏览器的版本信息。其原理是这样的:当客户端浏览器向服务
- 1.消息丢失1.生产者发送失败所有消息队列都可能发生的问题生产者发送消息后,队列未成功接收(网络原因或其他)而生产者不知情,消息丢失生产者发
- 这是一个很和谐很实用的网站管理程序,和我以前介绍的服务器管理程序不同的是,这个程序只有一个功能,就是实现远程Web方式删除文件(实际上是重命
- 在上一讲中已经连接了数据库。就数据库而言,连接之后就要对其操作。但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作
- 使用索引的场景:阿里云日志里出现了慢sql 然后发现publish_works_id字段会经常用于一些关联,所以决定把这个字段加上
- 前言在默认情况下,Python的新类和旧类的实例都有一个字典来存储属性值。这对于那些没有实例属性的对象来说太浪费空间了,当需要创建大量实例的
- 缘起最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>该书以java语言演绎了常见设计模式本系列笔记拟采用gol
- 一、ESlint+Vetur 实现ESlint代码规范二、重点----旧版本(旧版本配置在setting.json 会出现警告){“esli
- 在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器、迭代器和生成器理解进行
- 目录1.自定义行索引2. 按普通索引选择数据2.1 按普通索引选择单行数据2.2 按行索引选择多行数据3.按位置索引选择数据3.2 按位置索
- 如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。一个channel是一个通信机制,它可以让一
- 双向绑定Vue 的双向绑定是通过数据劫持和发布-订阅模式实现的。当 Vue 实例初始化时,它会对 data 选项中的每个属性使用 Objec
- 对图片进行resize、裁剪、旋转、翻转图片处理时常用的手段有resize、裁剪、旋转、翻转,简单介绍一下python中怎么利用PIL库和t
- Go被设计为一种后台语言,它通常也被用于后端程序中。服务端程序是GO语言最常见的软件产品。在这我要解决的问题是:如何干净利落地升级正在运行的
- 这两天在测试过程中,遇到这样的问题:数据量很大,一份csv文件的数据与另外一个文件的数据进行对比,但是csv中的文件数据量很大,并且进行统计
- 1.算法概述决策树算法是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策
- 本文实例讲述了asp.net C#实现解压缩文件的方法。一共给大家介绍了三段代码,一个是简单的解压缩单个zip文件,后一个可以解压批量的大量
- 工厂方法(Factory Method)模式又称为虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphi