基于高斯模型的肤色概率计算方法

1 概述

        美颜的核心是磨皮,而磨皮的对象是人像照片中的皮肤区域。因此,皮肤检测至关重要。

        皮肤检测算法一直以来是业界研究的热点,在工业和医疗中应用广泛。针对我们关注的美颜磨皮技术,能否避开头发、衣服等物品的干扰,能否实现视频流处理,都与皮肤检测的精度与速度息息相关。前文我们已经讲述了各种保边滤波算法,实际上,使用这些滤波算法处理人像的皮肤区域,就是我们所说的磨皮。

        目前,皮肤检测主要可以归纳为一下几种方法:

    • 基于颜色空间的皮肤检测算法
    • 基于随机森林决策树以及SVM的皮肤像素分类算法
    • 基于Deep Learning的皮肤区域分割算法

表1 皮肤检测/分割方法优劣对比表

皮肤检测/分割算法

速度

精度

颜色空间法

最快(基本不耗时)

最低(误检和少检率高)

皮肤像素分类法

DL皮肤区域分割法

快(可实时)

最高

        美颜项目在实际应用中往往要求皮肤检测既要准确又要高效,尤其是随着短视频应用的迅速崛起,高清视频实时处理已经成为流行趋势,能否在实时处理中应用皮肤检测算法,对于美颜效果至关重要。

        对照表1,在三大类检测方法中,基于颜色空间法速度最快,算法复杂度最低,精度也最低,但对于视频实时处理场景可以接受,因此,在视频实时处理中流行最广,目前大多数手机中的美颜应用都使用的是这种方法;皮肤像素分类法,速度慢,精度与DL皮肤区域分割法差距较大,只考虑了像素颜色特征,误检较多,因此,在DL皮肤区域分割法流行之前,基于用于处理照片检测;相对而言,DL皮肤区域分割法由于结合了像素颜色、空间位置和纹理特征,精度可以达到95%以上,随着GPU优化的深入,实时处理也不再试问题。因此,这类方法将是以后美颜算法应用的发展趋势。

        本文我们主要介绍颜色空间法----基于高斯模型的肤色概率计算方法。

2 基于高斯模型的肤色概率计算方法

        在实际应用中,由于基于颜色空间的肤色区域检测,无法准确检测出人像的皮肤区域,比如在光线多变以及在很多情况下,皮肤区域和非皮肤区域的判断,很难通过一个具体的阈值来决定。因此,为了追求更加自然逼真的磨皮效果,往往需要对全图进行肤色的概率衡量。对于一个像素值,不再通过某个设定阈值来决定它是否是皮肤,而是通过先验概率来映射,越接近肤色,那么就意味着它的类肤色概率越大,磨皮程度就越大,反之,类肤色概率越小,磨皮程度也越小。

2.1 算法步骤

        基于高斯模型的肤色概率计算方法基于以下核心假设:肤色像素在特定颜色空间(如YCbCr)中的分布符合多元高斯分布。这种方法主要包含两个阶段:训练阶段和检测阶段。

        训练阶段:

        (1)准备各类肤色的样本集,在YCbCr颜色空间内,统计样本集Cb和Cr分量对应的均值和方差

        (2)在YCbCr颜色空间内,对Cb和Cr分量分别构建简单高斯模型,每一种高斯模型构建如下所示

G_{c_b}(x_{c_b})=e^{-\frac{(x_{c_b}-\mu_{c_b})^2}{2\sigma_{c_b}}}

G_{c_r}(x_{c_r})=e^{-\frac{(x_{c_r}-\mu_{c_r})^2}{2\sigma_{c_r}}}

        其中x_{c_b}表示像素x对应的Cb分量,x_{c_r}表示像素x对应的Cr分量。

        注意:样本集的质量会影响最终的概率。

        检测阶段:未知像素P属于肤色的概率PDF计算如下:

PDF(x) = G_{c_b} * G_{c_r} * 2.0

2.2 代码实现  

float Gaussian(float x, float mean, float var)
{
	float t = -0.5f * (x - mean) * (x - mean) / var;
	return exp(t);
}

float GetPDF(int R, int G, int B, float meanCb, float varCb, float meanCr, float varCr)
{
	int Y, Cb, Cr;
	RGBToYCbCr(R, G, B, &Y, &Cb, &Cr);
	float pcb = Gaussian((float)Cb, meanCb, varCb);
	float pcr = Gaussian((float)Cr, meanCr, varCr);
	return 2.0f * pcb * pcr;
};

int mxSkinPDF(unsigned char* srcData, int width, int height, int stride)
{
	int ret = 0;
	float sum = 0, mean = 0, variance = 0;
	unsigned char* pSrc = srcData;
	for (int j = 0; j < height; j++)
	{
		for (int i = 0; i < width; i++)
		{
			//default setting is computed using special skin data.
			//meanCb-varCb:102-196
			//meanCr-varCr:143-196
			int gray = CLIP3(GetPDF(pSrc[2], pSrc[1], pSrc[0], 102, 196, 143, 196) * 255.0f, 0, 255);
			pSrc[0] = pSrc[1] = pSrc[2] = gray;
			pSrc += 4;
		}
	}
	return ret;
};

2.3 优化建议

    1. 多模型组合:对不同肤色类型建立多个高斯模型
    2. 亮度分层:对不同亮度区间建立不同的模型
    3. 后处理:对概率图进行形态学操作(如开闭运算)去除噪声
    4. 动态阈值:根据图像内容自适应选择概率阈值
    5. 结合其他特征:如纹理特征、空间连续性等

2.4 性能优化技巧

    1. 查表法(LUT):预先计算所有可能的CbCr值的概率,检测时直接查表
    2. 并行计算:使用OpenCV的并行处理或GPU加速
    3. 降采样处理:对大图像先降采样处理,再上采样结果
    4. ROI处理:只对可能包含皮肤的区域进行计算

3 演示Demo

3.1 开发环境

  • Windows 10 Pro x64
  • Visual Studio 2015

3.2 功能介绍

        演示程序主界面如下图所示,具有图像读取、显示、保存、图像保边滤波、基于RGB/HSV/YCgCr等颜色空间的肤色检测、肤色概率计算PDF、处理耗时等功能。

原图

肤色概率计算PDF效果图

3.3 下载地址

        开发环境:

  • Windows 10 pro x64
  • Visual Studio 2015

        下载地址:基于高斯模型的肤色概率计算方法Demo

参考

        图像视频滤镜与人像美颜美妆算法详解. 胡耀武、谭娟、李云夕. 电子工业出版社 2020-07

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值