【DIP】人脸皮肤检测方法汇总

Tags:DIP


HSV 颜色阈值分割

先将图像转换到HSV空间,然后在HSV空间进行阈值分割
两种颜色阈值都可以试试:
[0,10,60]
[20,150,255]

[7,10,60]
[20,150,255]

YCrCb 颜色阈值分割

经验而言, 黄种人皮肤像素值在Cr, Cb空间的分布为:Cr 133-173, Cb 77-127
至于为什么选择YCrCb空间以及阈值的确定, 可以参考这篇论文A New Fast Skin Color Detection Technique .

基于椭圆皮肤模型的YCrCb空间检测

可以参考这篇文章: https://www.cnblogs.com/skyfsm/p/7868877.html

YCrCb + OStu 自动阈值分割

也是主要参考那篇文章.
先将RGB图像转换到YCrCb颜色空间,提取Cr分量图像,然后对Cr做自二值化阈值分割处理
参考代码:

    Mat ycrcb_image;
    cvtColor(src, ycrcb_image, COLOR_BGR2YCrCb); //首先转换成到YCrCb空间
    Mat detect;
    vector channels;
    split(ycrcb_image, channels);
    Mat output_mask = channels[1];
    // imshow("YCrCb", output_mask);
    threshold(output_mask, output_mask, 0, 255, THRESH_BINARY | THRESH_OTSU);
    src.copyTo(detect, output_mask);

dlib 关键点定位

此外可以考虑使用dlib中的关键点定位模型,得到人脸的keypoints然后使用这些关键点对人脸的形状进行逼近,从而得到人脸区域。这种方法鲁棒性比较好,但是问题有两点:无法定位额头区域,需要自己推测;由关键点逼近人脸区域存在误差,特别是在边缘区域的误差会对效果造成较大的影响。
如:
原图:


【DIP】人脸皮肤检测方法汇总_第1张图片
image.png

dlib关键点信息:


【DIP】人脸皮肤检测方法汇总_第2张图片
image.png

由关键点得到的mask,


【DIP】人脸皮肤检测方法汇总_第3张图片
Screen Shot 2018-11-05 at 4.13.37 PM.png

综合以上几种方法和自己的经验,暂时觉得在YCrCb空间进行颜色分割是比较靠谱的方法,当然得到的初步mask需要进行很多处理,这里就不细说了。看几组结果吧:

第一组:


image.png
【DIP】人脸皮肤检测方法汇总_第4张图片
image.png

【DIP】人脸皮肤检测方法汇总_第5张图片
image.png

【DIP】人脸皮肤检测方法汇总_第6张图片
image.png

第二组:


【DIP】人脸皮肤检测方法汇总_第7张图片
image.png

【DIP】人脸皮肤检测方法汇总_第8张图片
image.png

【DIP】人脸皮肤检测方法汇总_第9张图片
image.png

【DIP】人脸皮肤检测方法汇总_第10张图片
image.png

第三组:


【DIP】人脸皮肤检测方法汇总_第11张图片
image.png
【DIP】人脸皮肤检测方法汇总_第12张图片
HSV_result.jpg
【DIP】人脸皮肤检测方法汇总_第13张图片
YCrCb_Otsu_result.jpg
【DIP】人脸皮肤检测方法汇总_第14张图片
YCrCb_result.jpg

由上至下分别为HSV, YCrCb_OStu分割, YCrCb阈值分割

基于神经网络的分割

实际上除了以上这些传统的分割方法,现在很多产品都是基于神经网络进行分割,皮肤分割只是portrait segmentation的一个子问题,只要由足够的训练样本和网络的速度足够快,可以取得非常好的分割效果。
这种方法的主要问题一是需要足够多的训练样本,二是速度限制,毕竟分割完成之后还需要进行进一步处理(各种美颜算法),效果可以很好,但是对技术的要求也很高。

下次贴一张我自己用分割网络做的人脸分割的效果图。

Reference

  1. https://www.cnblogs.com/skyfsm/p/7868877.html
  2. A New Fast Skin Color Detection Technique

你可能感兴趣的:(【DIP】人脸皮肤检测方法汇总)