基于彩色模型设计简单的肤色检测器
基于彩色模型设计简单的肤色检测器
- 说明
- 具体步骤
- 部分分析图表
- 代码
- 部分结果
- 结果分析
- 总结与分析
说明
此文主要通过手动收集中国人肤色的RGB等不同色彩模型数值,通过这些数值来对人脸进行判定。
具体步骤
- 使用画图工具获取肤色的RGB数值。
- RGB转HSV(可采用菜鸟的在线转换),在matlab中,HSV的表示范围为0-1。
- 记录数值。
- 分析数值,这边我使用了R语言。
- 确定阈值。
部分分析图表
代码
RGB
files=dir(‘lhj.jpg’); %读入图片
for i=1:length(files) %循环
s=files(i).name;
I=imread(s); %得到三维矩阵
I1=I;
R=I1(:,:,1); %红色通道
G=I1(:,:,2); %绿色通道
B=I1(:,:,3); %蓝色通道
id=R>150&G>100&G<210&B>90&B<200&(G-B)<40&(R-G)>20&(R-G)<70&((R-G)./(G-B))<9; %阈值
figure,subplot(2,1,1),imshow(I), %显示原始图像
subplot(2,1,2),imshow(id)
endHSV
files=dir(‘wjk.jpg’); %读入图片
for i=1:length(files)
s=files(i).name;
I=imread(s);
I1=rgb2hsv(I); %RGB转换为HSV
H=I1(:,:,1);
S=I1(:,:,2);
V=I1(:,:,3);
id=H>0.0128&H<0.09&S<0.55&S>0.1&V>0.33;
figure,subplot(2,1,1),imshow(I),
subplot(2,1,2),imshow(id)
end
部分结果
RGBHSV
RGBHSV
结果分析
- RGB与HSV的比较
在两个模型中,从测试结果来看,得出以下结论:
- 错误接受率HSV更高,也就是说HSV模型的肤色认定范围较广,一方面它可以尽可能多的将肤色识别出来,如一些带有阴影的区域,但同时也更多的将接近肤色的背景认定为肤色;
- 错误拒绝率则RGB更胜一筹,如组7组8,肤色的识别不够完整;
- 对于RGB模型限定了三者之间的关系,而HSV模型只考虑了单个之间的关系,可HSV模型的测试结果却还不错,如果对HSV模型进行深入挖掘应该可以得到比RGB模型好不少的结果;
我认为HSV模型会优于RGB模型。因为HSV模型三者的数值范围在[0,1]之间,在本次实验中我取到小数点后4位,而RGB模型只采用单一的整数,所以,HSV表示的颜色更为精确,如果有一个良好的模型,对于肤色的识别也会更加精确吧。
- 综上,我认为HSV的颜色空间更好一些。但要得到更加精确的效果,50组的样本数据是远远不够的,对数据的挖掘也不够深入,RGB、HSV三者之间的关系应该进行深入研究。
总结与分析
参考相关资料,用于肤色检测的方法大概有以下几种,基于RGB的肤色检测、基于椭圆模型的肤色检测、基于YCrCb颜色空间的肤色检测、基于HSV的肤色检测、opencv自带的肤色检测函数AdaptiveSkinDetector等。有很多影响肤色的因素,比如拍照时的灯光、拍照的时间等等。
我尝试了其中的一些方法,并结合网上的效果图,发现效果也是大同小异,没有什么特别好的方法。下图为基于YCrCb颜色空间的肤色检测效果,采用的仍然是matlab。
要更好的检测出肤色应该先将人检测出来,使人物与背景分离,只在人物的范围上进行肤色检测,这样可以减少其他事物中与肤色相近的元素也被认定为肤色,即降低错误接受率。当能检测出人物的大致范围后,再进行肤色阈值进一步的确定,使肤色检测更为精确。
还没有评论,来说两句吧...