这几天做安全帽检测器,需要定位人脸的部位,就需要用到皮肤检测。
在经过行人检测过后,定位图像中人的位置以后,标记出人的位置,然后将标记过后的行人框当作
皮肤检测的目标范围。
在网上学习了一下,目前有很多检测的技术,这篇文章里做个总结。
1.基于RGB通道检测
在检测范围内对每个像素点通过RGB值来进行判断:
经过大量研究,肤色在RGB模型中的范围满足一下判别式:
只要在像素通道值判断中通过上述表达式进行检测即可。
2.基于YCrCb空间椭圆模型检测
同样是经过大量的研究,将皮肤模型映射到YCrCb空间中,那么在CrCb的二维空间当中,满足肤色的
值将会落在一个椭圆的区域内:
那么通过代入(Cr,Cb)坐标的然后判断是否落在椭圆区域内即可。
3.YCrCb空间中Cr分量+Otus阈值法
(1)YCrCb空间:
Y即为明亮度,CrCb即为色度,分别为色调与饱和度。
更多的关于YCrCb的信息网上都有,就不具体介绍了。
(2)最大类间方差法(Otus):
使用一个阈值将整个数据空间分为两类,通过两个类之间的方差值来获得最优的阈值。
我们需要做的就是将RGB空间映射到YCrCb空间,然后提取Cr分量;
然后对Cr进行二值化阈值分割,利用上面Otus法判断即可。
4.基于YCrCb空间CrCb分量范围筛选
类似法一,也是通过前人的大量统计,
黄种人的Cr范围在133和173之间,Cb分量在77和127之间。
然后根据项目的实际情况灵活调控这个范围在进行范围检测即可。
5.HSV空间H分量范围筛选
HSV空间:分别为H色调,S饱和度,V明度。根据颜色的直观特性建立的色彩空间模型,
也被称为六角锥模型。
(1)色调H:用角度度量,取值范围为0°~360°,
从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。
它们的补色是:黄色为60°,青色为180°,品红为300°;
(2)饱和度S:取值范围为0.0~1.0;
(3)亮度V:取值范围为0.0(黑色)~1.0(白色)。
满足皮肤模型的范围:
通过上面的范围判断即可。
6.基于YCrCb空间高斯模型检测
高斯模型主要利用了统计学原理,肤色这样符合正态分布的统计样本,在特征空间中的分布应当
满足高斯分布。
关于高斯分布不做过多的介绍。
(1)我们要做的就是在YCrCb空间当中,
得到Cr和Cb分量的值,通过样本得到均值Mean(MCb,MCr)和协方差矩阵C(这是一个
统计过程,所以说这种检测方法和机器学习结合可能实际效果好一些吧)。
(2)将均值和协方差矩阵代入二维高斯函数:
下面是一个python实现的版本。
上面得到的FaceProbImg是像素属于皮肤区域的概率,我们设置一个阈值threshold,
比较得到的概率和阈值即可。
经过上面的对比,最后选择了椭圆模型,感觉效果最好,相比来说实现也比较简单。
关键代码如下:
上面这段代码可以更换结构,来使用不同的模型进行检测。
上面这段代码是
为了使肤色聚类不受亮度Y 的影响将YCbCr 颜色空间中的色度Cb、Cr进行非线性变换。
参考文献:
《基于分裂式K均值聚类的肤色检测方法》
目前学习到的就这些了。