最近老師佈置了一個小作業,檢測圖像中的皮膚。
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、代碼
等待審覈中