最近老师布置了一个小作业,检测图像中的皮肤。
1、基于颜色空间
已经有很多博客写了:
python:https://www.cnblogs.com/demodashi/p/9437559.html
c++:https://www.cnblogs.com/skyfsm/p/7868877.html
其中基于Ycrcb的效果比较好,但是非常容易受背景干扰(后俩张几乎背景都包含在里面了)。
我也把c++版本的 基于椭圆皮肤模型的方法用python 实现了一下,但是 python的画椭圆的函数只能输入int型数据,所以后来效果也不是很好,于是放弃。
2、基于随机森林的皮肤分割 参考文章:肤色检测(分割)via Random Forest
下载了文中的两篇2010 2012的论文读了一下,也下载了数据集,自己试了一遍,效果不错。
样本数:245057 (其中有50,000+正样本,剩余负样本)
特征: B G R(像素颜色,注意与opencv读取的颜色顺序一样)
类别: 2类(肤色1/非肤色2)
这个方法受背景影响小一点,但是对于皮肤上的反光、痘痘之类的,检测效果不如Ycrcb。
(1)随后我又加了去噪和磨皮:https://www.jianshu.com/p/3a028a908c19.
但是皮肤高光经过去噪或者磨皮以后会整个脸都变亮了,分割效果并没有提升。(但是真的变好看了)
(2)随后又加了去高光:
illuminationChange 的方法不好,它其实就类似于拿附近的像素点去填充(可能是我的mask搞得不好吧)
去反光参考博文:https://blog.csdn.net/weiwei9363/article/details/85046877
代码:https://github.com/jiemojiemo/some_specular_detection_and_inpainting_methods_for_endoscope_image
确实能够去除反光,但是会把眼球的白色当成反光一起处理了,真是心塞!
3、结果展示
依次是:原图 Ycrcb 随机森林 磨皮 去高亮
4、代码
等待审核中