人像美肤-人脸检测+双边滤波

人像美肤-人脸检测+双边滤波

一、人像美肤

使用人脸检测 + 自实现的双边滤波,可以对图像中多张人脸进行美肤平滑。
项目地址:https://github.com/wchstrife/DigitalImageProcessing

1.1 运行环境

  • python 3.7
  • numpy
  • opencv

1.2 运行

  1. cd Skin-Filter
  2. 修改beatyskin.pymain函数的filename为输入图片的路径,默认为data下的图片
  3. python beatyskin.py
  4. 默认输出在根目录下newimage.jpg处理后的图像

1.3 算法原理

首先对于输入的图片,调用detect函数进行人脸检测。

人脸检测使用了opencv预训练好的模型,模型存在haarcascade_frontalface_default.xml中,返回一个list,list中每一项代表存在人脸的一个矩形区域。

对于每个人脸矩形区域,进行双边滤波bilateral_filter()

双边滤波的基本原理是在高斯滤波的基础上,同时考虑模板的空间位置距离和颜色值域的距离。所以在计算卷积模板的时候,需要同时计算两个因素,合成一个卷积模板。根据以下公式进行计算:
w(i,j,k,l)=exp((ik)2+(jl)22δd2I(i,j)I(k,l)22δr2) w(i,j,k,l) = exp(-\frac{(i-k)^2+(j-l)^2}{2\delta _d^2} - \frac{||I(i,j)-I(k,l)||^2}{2\delta_r^2})
ID(i,j)=k,lI(k,l)w(i,j,k,l)k,lw(i,j,k,l) I_D(i,j) = \frac{\sum_{k,l}I(k,l)w(i,j,k,l)}{\sum_{k,l}w(i,j,k,l)}
其中 ID(i,j)I_D(i,j)代表pixel(i,j)pixel(i,j)的滤波后的像素,需要注意的是,在双边滤波的时候要对图像的三个通道进行分别处理。

超参数设置:

  1. 卷积模板使用7*7大小
  2. δd\delta_dδr\delta_r代表空间域和像素域的平滑程度,各取20

1.4 算法效果

输入一张512*512,tiff格式的Lenna图,左边为滤波前效果,右边为滤波后效果。

人像美肤-人脸检测+双边滤波人像美肤-人脸检测+双边滤波
细节对比:可以观察到只有在框内的区域进行了平滑。

人像美肤-人脸检测+双边滤波