基于彩色模型设计简单的肤色检测器

说明

此文主要通过手动收集中国人肤色的RGB等不同色彩模型数值,通过这些数值来对人脸进行判定。

具体步骤

  1. 使用画图工具获取肤色的RGB数值。
  2. RGB转HSV(可采用菜鸟的在线转换),在matlab中,HSV的表示范围为0-1。
  3. 记录数值。
  4. 分析数值,这边我使用了R语言。
  5. 确定阈值。

部分分析图表

在这里插入图片描述
在这里插入图片描述

代码

  • 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)
end
  • HSV
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

部分结果

RGB在这里插入图片描述HSV在这里插入图片描述
RGB在这里插入图片描述HSV在这里插入图片描述

结果分析

  • RGB与HSV的比较
    在两个模型中,从测试结果来看,得出以下结论:
  1. 错误接受率HSV更高,也就是说HSV模型的肤色认定范围较广,一方面它可以尽可能多的将肤色识别出来,如一些带有阴影的区域,但同时也更多的将接近肤色的背景认定为肤色;
  2. 错误拒绝率则RGB更胜一筹,如组7组8,肤色的识别不够完整;
  3. 对于RGB模型限定了三者之间的关系,而HSV模型只考虑了单个之间的关系,可HSV模型的测试结果却还不错,如果对HSV模型进行深入挖掘应该可以得到比RGB模型好不少的结果;
  4. 我认为HSV模型会优于RGB模型。因为HSV模型三者的数值范围在[0,1]之间,在本次实验中我取到小数点后4位,而RGB模型只采用单一的整数,所以,HSV表示的颜色更为精确,如果有一个良好的模型,对于肤色的识别也会更加精确吧。
  • 综上,我认为HSV的颜色空间更好一些。但要得到更加精确的效果,50组的样本数据是远远不够的,对数据的挖掘也不够深入,RGB、HSV三者之间的关系应该进行深入研究。

总结与分析

参考相关资料,用于肤色检测的方法大概有以下几种,基于RGB的肤色检测、基于椭圆模型的肤色检测、基于YCrCb颜色空间的肤色检测、基于HSV的肤色检测、opencv自带的肤色检测函数AdaptiveSkinDetector等。有很多影响肤色的因素,比如拍照时的灯光、拍照的时间等等。
我尝试了其中的一些方法,并结合网上的效果图,发现效果也是大同小异,没有什么特别好的方法。下图为基于YCrCb颜色空间的肤色检测效果,采用的仍然是matlab。

在这里插入图片描述
在这里插入图片描述

要更好的检测出肤色应该先将人检测出来,使人物与背景分离,只在人物的范围上进行肤色检测,这样可以减少其他事物中与肤色相近的元素也被认定为肤色,即降低错误接受率。当能检测出人物的大致范围后,再进行肤色阈值进一步的确定,使肤色检测更为精确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值