1 概述
美颜的核心是磨皮,而磨皮的对象是人像照片中的皮肤区域。因此,皮肤检测至关重要。
皮肤检测算法一直以来是业界研究的热点,在工业和医疗中应用广泛。针对我们关注的美颜磨皮技术,能否避开头发、衣服等物品的干扰,能否实现视频流处理,都与皮肤检测的精度与速度息息相关。前文我们已经讲述了各种保边滤波算法,实际上,使用这些滤波算法处理人像的皮肤区域,就是我们所说的磨皮。
目前,皮肤检测主要可以归纳为一下几种方法:
-
- 基于颜色空间的皮肤检测算法
- 基于随机森林决策树以及SVM的皮肤像素分类算法
- 基于Deep Learning的皮肤区域分割算法
表1 皮肤检测/分割方法优劣对比表
皮肤检测/分割算法 | 速度 | 精度 |
颜色空间法 | 最快(基本不耗时) | 最低(误检和少检率高) |
皮肤像素分类法 | 慢 | 高 |
DL皮肤区域分割法 | 快(可实时) | 最高 |
美颜项目在实际应用中往往要求皮肤检测既要准确又要高效,尤其是随着短视频应用的迅速崛起,高清视频实时处理已经成为流行趋势,能否在实时处理中应用皮肤检测算法,对于美颜效果至关重要。
对照表1,在三大类检测方法中,基于颜色空间法速度最快,算法复杂度最低,精度也最低,但对于视频实时处理场景可以接受,因此,在视频实时处理中流行最广,目前大多数手机中的美颜应用都使用的是这种方法;皮肤像素分类法,速度慢,精度与DL皮肤区域分割法差距较大,只考虑了像素颜色特征,误检较多,因此,在DL皮肤区域分割法流行之前,基于用于处理照片检测;相对而言,DL皮肤区域分割法由于结合了像素颜色、空间位置和纹理特征,精度可以达到95%以上,随着GPU优化的深入,实时处理也不再试问题。因此,这类方法将是以后美颜算法应用的发展趋势。
本文我们主要介绍颜色空间法----基于高斯模型的肤色概率计算方法。
2 基于高斯模型的肤色概率计算方法
在实际应用中,由于基于颜色空间的肤色区域检测,无法准确检测出人像的皮肤区域,比如在光线多变以及在很多情况下,皮肤区域和非皮肤区域的判断,很难通过一个具体的阈值来决定。因此,为了追求更加自然逼真的磨皮效果,往往需要对全图进行肤色的概率衡量。对于一个像素值,不再通过某个设定阈值来决定它是否是皮肤,而是通过先验概率来映射,越接近肤色,那么就意味着它的类肤色概率越大,磨皮程度就越大,反之,类肤色概率越小,磨皮程度也越小。
2.1 算法步骤
基于高斯模型的肤色概率计算方法基于以下核心假设:肤色像素在特定颜色空间(如YCbCr)中的分布符合多元高斯分布。这种方法主要包含两个阶段:训练阶段和检测阶段。
训练阶段:
(1)准备各类肤色的样本集,在YCbCr颜色空间内,统计样本集Cb和Cr分量对应的均值和方差
(2)在YCbCr颜色空间内,对Cb和Cr分量分别构建简单高斯模型,每一种高斯模型构建如下所示
其中表示像素x对应的Cb分量,
表示像素x对应的Cr分量。
注意:样本集的质量会影响最终的概率。
检测阶段:未知像素P属于肤色的概率PDF计算如下:
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 优化建议
-
- 多模型组合:对不同肤色类型建立多个高斯模型
- 亮度分层:对不同亮度区间建立不同的模型
- 后处理:对概率图进行形态学操作(如开闭运算)去除噪声
- 动态阈值:根据图像内容自适应选择概率阈值
- 结合其他特征:如纹理特征、空间连续性等
2.4 性能优化技巧
-
- 查表法(LUT):预先计算所有可能的CbCr值的概率,检测时直接查表
- 并行计算:使用OpenCV的并行处理或GPU加速
- 降采样处理:对大图像先降采样处理,再上采样结果
- 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