自适应的肤色检测算法与美颜滤镜 您所在的位置:网站首页 美颜算法原理 自适应的肤色检测算法与美颜滤镜

自适应的肤色检测算法与美颜滤镜

2023-08-18 10:45| 来源: 网络整理| 查看: 265

最近,我在合作实现一个有美肤、瘦脸功能的美颜滤镜,作为数字图像处理课程的大作业。我负责美肤部分,这几天设计、实现了肤色检测、美白降噪的相关算法,自觉研究了些东西,就写了这篇笔记。

其中的美白降噪部分比较简单,只要调色、滤波就可以了,剩下的是用经验、技巧来改善效果。这篇文章以论述肤色检测为主,课题的其他部分也会有所涉及。

现有的肤色检测算法

目前的肤色检测算法有这几类:

简单阈值法。例如,在RGB颜色空间中划分出皮肤颜色的阈值,或者排除亮度分量,如在YCrCb空间中对Cr、Cb进行筛选。 自适应阈值法。例如,在YCrCb空间,对Cr分量做OTSU分割,因为一个人肤色的颜色范围不大嘛。 颜色建模法。这是对颜色更进阶的筛选。例如,椭圆模型,因为肤色的Cr、Cb分布图像接近椭圆,把Cr、Cb坐标落入经验椭圆内的像素判定为肤色像素。还有课堂上提到的高斯模型,其实它的分界和椭圆模型是非常接近的。理论上,也可以做更复杂的假设,用更强的模型,但对于颜色特征来说,可能没必要,容易过拟合。 特征更丰富的复杂模型。除了一个点颜色值,也可以用一个区域、甚至整幅图像的像素,引入形态学特征、纹理特征等等,这变为一个机器学习问题。

前三类方法出现得比较多,它们的比较可以参见这篇文章。用得多是由肤色检测的应用性质决定的,通常对检测的速度要求比较高,甚至需要用于视频实时检测。而对于美颜滤镜这类应用,对精度没有特别高的要求,因为肤色美化是柔和的,被美化区域的边界是羽化的。

当然,在控制算法复杂度的前提下,肤色检测越准越好。现有的算法准确度是很一般的,那篇对比文章里的效果经过了针对性的参数调整,如果在光照、肤色、拍摄器材各异的现实场景中,将很难找到精准定位皮肤区域又不引入噪声的通用经验模型。

下图为Cr、Cb阈值法的皮肤检测结果:

Cr、Cb阈值法对不同人种的肤色是适用的:

但也意味着当背景位于这个较大的肤色范围时,效果的不理想:

自适应的肤色检测模型

现有的肤色检测模型存在着肤色检测范围和背景色误判的矛盾。但对于同一个人来说,他的肤色范围相比人类全体狭窄了很多,如果能针对他的肤色建模,再做筛选,有望大幅提升准确度。

我们所做的美颜滤镜刚好提供了这一思路的必要条件:美颜滤镜需要用到人脸检测,那么肤色检测模型可以利用人脸像素建模。

即先对照片做人脸检测,检测结果既用于瘦脸,也用肤色建模,这就在不增加计算成本的情况下,提升了肤色检测的精度。

单人肤色模型的选择

由于面部像素的数量有限(样本少),而且需要对照片的所有人脸分别建模和检测(计算复杂度不能太高),这就要求一个简单的单人肤色模型。

其实,我还有一种思路:收集大量的肤色样本去训练一个较复杂的模型,它以单人的面部像素特征作为输入,输出的是这个人的肤色分布。这种方法需要大样本集和对复杂模型的构建和调试,不是几天工作量的大作业了。

肤色是皮肤的固有性质,与亮度无关,通常在建模时会剔除亮度分量。当然,皮肤的光泽是体现在亮度里的,这里就忽略了。下面是我在YCrCb空间对Cr、Cb分量所作的热力图:

可以看到,Cr、Cb分量坐标点的聚集比较紧密,我选择用高斯分布对单人肤色进行建模。

多元高斯分布的参数估计与概率计算

极大似然法的高斯分布参数估计式很直觉,就是样本的均值和协方差,即:

μ=x¯ \mu=\bar{x} μ=​x​¯​​Σ=cov(x,x) \Sigma=cov(x,x) Σ=cov(x,x)

于是,我们得到了肤色Cr、Cb分量的高斯分布:x∼N(μ,Σ)x\sim N(\mu,\Sigma)x∼N(μ,Σ),也就得到了Cr、Cb的概率密度,于是根据像素点的概率密度与分布中心点密度的相对关系估计是否为肤色。这样做比较启发式,既然使用了高斯模型,有没有更直观,可以从概率上解释的筛选准则呢?

有,这涉及到多元高斯分布的由来。

先忽略上图的那句话(它已经给出了答案),左图是一个一般的二元变量分布,简单地说(复杂的我也不会说。。),二元高斯分布的假设是:对样本坐标作平移和伸缩变换,使其均值落在原点,沿各个方向的标准差为1(即各分量的方差为1,分量间的协方差为0),此时样本坐标到原点的距离服从标准正态分布:d∼N(0,1)d\sim N(0,1)d∼N(0,1)

那么,对于一个待检测像素(Cr,Cb),只要根据得到的高斯分布模型的参数μ\muμ和Σ\SigmaΣ,对它作坐标变换,然后求出到原点的距离,就可以参照标准正态分布的概率表了。

事实上,(Cr,Cb)坐标与距离的关系并不用推导,答案已经包含在多维高斯分布的概率密度函数中了。

标准正态分布的概率密度为:

f(x)=12πexp(−12x2) f(x)=\frac{1}{\sqrt{2\pi}}\exp(-\frac{1}{2}x^2) f(x)=​√​2π​​​​​1​​exp(−​2​​1​​x​2​​)

其中公式前的系数12π\frac{1}{\sqrt{2\pi}}​√​2π​​​​​1​​使其积分为1。

多元高斯分布的概率密度为:

f(x)=1∣Σ∣(2π)kexp(−12(x−μ)TΣ−1(x−μ)) f(x)=\frac{1}{\sqrt{\vert\Sigma\vert(2\pi)^k}}\exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)) f(x)=​√​∣Σ∣(2π)​k​​​​​​​1​​exp(−​2​​1​​(x−μ)​T​​Σ​−1​​(x−μ))

对比两式,按照多元高斯分布的定义,(x−μ)TΣ−1(x−μ)(x-\mu)^T\Sigma^{-1}(x-\mu)(x−μ)​T​​Σ​−1​​(x−μ)就是我们要找的距离的平方。我们寻找的坐标和距离的关系在得到多元高斯分布密度公式的过程中已经推导过了,具体的推导过程,可以参考这篇文章。

至于为什么归一化系数不一样,这里也解释一下。事实上,我们是根据∫(x−μ)TΣ−1(x−μ)=d2f(x)dx=f(d)\int\limits_{(x-\mu)^T\Sigma^{-1}(x-\mu)=d^2}f(x)dx=f(d)​(x−μ)​T​​Σ​−1​​(x−μ)=d​2​​​∫​​f(x)dx=f(d)解出多元高斯分布的概率密度公式,式中的f(x)f(x)f(x)在积分范围内是常数,因此两式的系数相差∫(x−μ)TΣ−1(x−μ)=d2dx\int\limits_{(x-\mu)^T\Sigma^{-1}(x-\mu)=d^2}dx​(x−μ)​T​​Σ​−1​​(x−μ)=d​2​​​∫​​dx倍。这其实是上一段的前提,正因为只是系数的差别,我们才能从多元高斯分布的密度公式中看出坐标与距离的关系。

于是,我们的模型可以加入一个期望参数ppp,我把它定义为:如果一个人肤色符合所建立的高斯模型,则他的肤色像素被包含在模型的筛选结果里的比例的期望为ppp。

对应的筛选条件为:

(x−μ)TΣ−1(x−μ)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有