双边滤波的人脸磨皮算法(宋茜)

本文将介绍双边滤波的原理以及在人脸磨皮中的应用。


双边滤波原理

双边滤波器是保边滤波器中广为人知的一种。保边滤波器指在滤波过程中能够有效的保留图片中的边缘信息的一类特殊滤波器。双边滤波器,顾名思义是由地位平等的两边共同决定的。两边分别包含像素值(值域)和像素位置(空域)。在值域指的是两个像素值的差值,差值越小,越不可能是边缘,应该对其进行平滑处理,反之,则尽力保留。在空域指的是像素点之间距离。距离越远,对当前像素点的参考性越低,反之,则越高。双边滤波器公式如下:
在这里插入图片描述其中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 deepcopy

def 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,否则设为0
    for 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.0
            else:
                skin3[i][j] =  0.0
                result_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!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值