双边滤波的人脸磨皮算法(宋茜)
本文将介绍双边滤波的原理以及在人脸磨皮中的应用。
文章目录
- 双边滤波原理
- 人脸磨皮算法
双边滤波原理
双边滤波器是保边滤波器中广为人知的一种。保边滤波器指在滤波过程中能够有效的保留图片中的边缘信息的一类特殊滤波器。双边滤波器,顾名思义是由地位平等的两边共同决定的。两边分别包含像素值(值域)和像素位置(空域)。在值域指的是两个像素值的差值,差值越小,越不可能是边缘,应该对其进行平滑处理,反之,则尽力保留。在空域指的是像素点之间距离。距离越远,对当前像素点的参考性越低,反之,则越高。双边滤波器公式如下:
其中i,j为像素点中心坐标。k,l代码特定窗口内像素坐标。w(i,j,k,l)为权重系数。其中w(i,j,k,l)的权重由上述两个滤波器的相应权重共同决定,如下所示:
为了更形象的说明两个权重的影响,作者还给出了二维图像,直观的说明(这个图真的太直观给力了!):
人脸磨皮算法
人脸磨皮是人脸美颜中常见的操作。磨皮算法的功能就是消除脸部的斑点、瑕疵或者杂色,使得人物脸部更加细腻,轮廓更加清晰。在实际的人脸磨皮中,一般还包含不同程度的预处理。目前主要包括基于深度学习的人脸皮肤的提取和传统方法的人脸皮肤的提取。在本文中,我们使用传统的方法先对人脸中的脸部皮肤区域进行提取。基于皮肤的颜色特性,我们将图像转换到HSV色域,然后对逐像素点阈值判断,分离出了人脸面部皮肤像素点集合。在代码运行中,我们先对整张图片进行了双边滤波,然后将双边滤波结果和原图片输入原函数,使用皮肤像素点判断的方法,将原图中皮肤的像素替换成了对应的双边滤波后的像素。使用这样的方法,能够使滤波算法在处理人脸皮肤时,不对其它器官,如嘴唇,眼睛,眉毛等造成影响,同时不会干扰到背景。
注意:(滑动窗口的大小和双边方差的参数不宜设置的过大,否则会造成磨皮效果模糊或者过于磨皮。同时设置过小,磨皮效果不明显)
在本文中将借助python opencv使用双边滤波对人脸进行磨皮操作。
cv2.bilateralFilter():
主要有四个参数:
src:输入的图片
d: 滑动窗口的大小
sigmoidcolor:域值权重的方差
sigmoidspace: 空间权重的方差
代码如下(示例):
import cv2
import matplotlib.pyplot as plt
import numpy as np
from copy import deepcopydef t2s(img):return cv2.cvtColor(img,cv2.COLOR_BGR2RGB)img = cv2.imread("suyan.jpg")
#---------------------------------------#
#转换到hsv域获得对应的二值分割图
#---------------------------------------#
def get_face(image_origin,image):result_face = deepcopy(image)hsv = cv2.cvtColor(image_origin, cv2.COLOR_BGR2HSV) # 把图像转换到HSV色域(_h, _s, _v) = cv2.split(hsv) # 图像分割, 分别获取h, s, v 通道分量图像skin3 = np.zeros(_h.shape, dtype=np.float32) # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据(height,width) = _h.shape # 获取源图像数据的长和宽# 遍历图像, 判断HSV通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0for i in range(0, height):for j in range(0, width):if (_h[i][j] > 5) and (_h[i][j] < 120) and (_s[i][j] > 18) and (_s[i][j] < 255) and (_v[i][j] > 50) and (_v[i][j] < 255):skin3[i][j] = 1.0else:skin3[i][j] = 0.0result_face[i,j] = image_origin[i,j]result_face = result_face.astype(np.uint8)return skin3,result_face#--------------------------------------#
#使用双边滤波获得磨皮效果图
#--------------------------------------#
d_20 = cv2.bilateralFilter(img,10,20,20)
d_100 = cv2.bilateralFilter(img,10,50,50)
d_200 = cv2.bilateralFilter(img,10,100,100)#--------------------------------------# ,
#获得对人脸有效区域进行滤除之后的人脸美颜结果
#--------------------------------------#
_, d_20 = get_face(img,d_20)
_,d_100 = get_face(img,d_100)
_,d_200 = get_face(img,d_200)temp = cv2.hconcat([img,d_20,d_100,d_200])
temp = deepcopy(temp)
plt.figure(figsize=(20,20))
plt.imshow(t2s(temp))
plt.show()
cv2.imwrite('smooth_skin.jpg',temp)
欢迎喜欢的小伙伴们点赞,第一个给我点赞的人,会是你吗? best wishes!
双边滤波的人脸磨皮算法(宋茜)相关推荐
- 双边滤波去雾matlab,基于双边滤波的去雾算法.doc
基于双边滤波的去雾算法 中图法分类号:TP391.41 文献标识码:A 文章编号:1006-8961(2013) - - 论文引用格式: 基于双边滤波的图像去雾 王一帆1 ,尹传历2,黄义明1 , 王 ...
- c语言中人脸磨皮算法,美颜算法中磨皮的原理
谈到磨皮美颜,大家可能认为是一个很高深难懂的事情,网上搜索关于美颜的文章,一般都是搬出许多算法,看得让你头晕目眩的.今天将用大白话来让你快速认识磨皮美颜原理,轻松get到她的点!只要你耐着性子读完本篇 ...
- 基于双边滤波的人脸美化
人像美化类软件中通常会提供一个磨皮功能,可以使得皮肤变得柔和,去除痘痘和斑点.本文基于OpenCV中的双边滤波器实现了一个简单的人脸美化功能. 双边滤波,Bilateral filter,是一种保持边 ...
- 实现人脸磨皮算法---OpenCV-Python开发指南(58)
目录 人脸磨皮原理 实现人脸磨皮效果 人脸磨皮原理 人脸磨皮是最基础的人脸美颜效果.主要分为祛斑,祛痘,淡化黑眼圈等步骤.通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果. 因为 ...
- Opencv C++成长之路(八):高斯双边滤波 (图像处理磨皮)
滤波结果 原图像 高斯双边滤波结果 与高斯滤波的区别 两者的区别在于,高斯滤波在滤波时会将图像中各个颜色区域的边缘同区域本身一起模糊掉,而高斯双边滤波则是对各个区域的交界边缘有所保留. 对于高斯滤波来 ...
- matlab双边收敛,双边滤波(bilateral filter)快速算法 matlab实现代码
本算法参考自论文"Paris S, Durand F. A fast approximation of the bilateral filter using a signal process ...
- 基于CBF(cross bilateral filter)交叉双边滤波的图像融合算法仿真
目录 1.算法仿真效果 2.MATLAB源码 3.算法概述 4.部分参考文献 1.算法仿真效果 matlab2022a仿真结果如下:
- c语言双边滤波算法,快速双边滤波 附完整C代码
很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...
- 基于边缘检测的磨皮算法实现——OpenGL版
一.背景 人脸磨皮算法的本质是模糊算法,但是与模糊算法最大的区别是,磨皮算法需要考虑保边效果,需要达到"磨皮了但又保留了脸部的各种纹理细节和边缘信息"的效果.保边的思路甚至与模糊的 ...
最新文章
- 【STM32】FreeRTOS 系统配置
- JavaWeb Cookie详解
- EF 关系规则(一对一、一对多、多对多...)
- php mysql int string_mysql查出的 int 型字段都是 string
- leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)
- oracle日志查看问题?
- 多个折线样式_Python数据可视化实例:关于图表“贵族”折线的增强优化方法
- sap hana安装教程
- 这个好像、也许、或许、大概、应该、Maybe真的可以算是传说中的Spring.Net了吧...
- html页面退格代码,HTML中的退格键
- iOS中app在iTunes中更新版本流程
- HIbernate关联映射小案例(CRUD)
- linux docker启动指定字符集,【字符集】解决docker 容器中中文乱码问题
- C语言 计算学生各科成绩平均分的总和
- VBA,单元格处理,数据复制,格式设置,折线图,图表属性设置
- 信息系统安全导论第六章之软件安全
- linux系统发qq邮箱文件,Linux打印文件和发送邮件
- 动手深度学习笔记(一)2.1数据操作
- 嵌入式linux开发笔记: gcc选项
- 转载(https://blog.csdn.net/qq_36738482/article/details/72823509)大数据的概念