颜色空间人脸检测
实验目的
使用颜色空间的方法检测人脸,并用二值化的方法进行显示。
实验内容
选定图像色彩模型
如果使用RGB颜色模型,当光照、肤色稍微变化时,对RGB各分量的灰度值有较大的影响。所以通过查阅资料,最终选定了YCbCr颜色空间作为人脸检测的颜色模型,并选定Cr分量的灰度作为判定标准。
YCbCr颜色模型
YCbCr空间是一种常见的色彩模型,其中Y表示亮度信息,Cb和Cr表示色度信息。其中Cb表示蓝色的浓度偏移成分,Cr表示红色的浓度偏移成分。而人脸主要是红色成分,所以主要考虑Cr分量的灰度值。
RGB颜色模型转YCbCr颜色模型公式如下:
确定人脸灰度区间
我找了两张黄种人的图片,将其中的人脸区域截出,观察Cr分量的灰度直方图如下:
根据观察,然后结合查阅的资料,黄种人的肤色对应的Cr分量在140-160范围内。
根据上面两张图的对比,光照对于Cr分量影响不大,所以图片几乎可以不用预处理就可以直接提取Cr分量判断。
人脸检测
人脸检测主要分为以下三个步骤:
- 提取图片的Cr分量,并二值化
- 使用5*5的中值滤波器去出噪声
- 对连通区域标号,并统计每个连通区域的面积,面积小于图片总面积的0.25%时认为是噪声
其中,第3步我们曾经使用闭操作,尝试修补孔洞。但是有些对于背景复杂的照片,有些空洞是较大的,这就需要提高结构元素的大小。但是,当结构元素过大的时候,执行闭操作之后人脸的边界形状会被严重破坏。所以,我们最终使用了现在的统计连通块面积占比的方法。
结果与反思
实验结果
- 实验中,对6张图片进行颜色空间人脸检测结果如下。
- 每张图片包含4张图片依次为:
- 原始图像
- 提取原始图像Cr分量,并二值化后的结果
- 对二值化图像使用5*5中值滤波器平滑后的结果
- 对平滑后的图像进行连通块标号,并填补孔洞后的结果
结果反思
- 在一些背景较为复杂的照片中,有一定的概率会存在某个较大区域的Cr分量和人脸的Cr分量相符,都在140到160之间。这种情况暂时还没有想出办法解决。
- 程序中需要确定一个连通块面积占总图片总面积的占比,这个占比根据不同的图片会有一些差别。以人为照片主体的时候,0.25%的占比较为合适;但如果人很小,图片主要是背景的时候,则人脸会被当做噪声处理掉。
- 人脸检测主要是提取人脸部分,但是由于很多照片有人体其他部位裸露,且裸露区域较大,也会被当做人脸区域。我们曾经考虑利用形状判断——人脸更偏向于正方形或长方形,但是很多时候,手或小臂的形状也是正方向或长方形,因此仍然无法排除这一部分。
程序实现
- 统计人脸Cr灰度区间:show.py
1 | # -*- coding:utf-8 -*- |
- 人脸检测:face.py
1 | # -*- coding:utf-8 -*- |