简单的基于YCrCb颜色空间的人脸检测(肤色)

本文介绍了一种基于YCrCb颜色空间的人脸检测方法,通过RGB到YCrCb的转换、阈值分割、中值滤波等步骤实现人脸区域的提取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的基于YCrCb颜色空间的人脸检测(肤色)

环境:Windows XP+MATLAB 2010b

基本思路:

1)将基于彩色空间的RGB模型转换为YCbCr模型(考虑到人脸的生理特征,只采取了Cr分量作为辅助)

2)阈值分割,根据多次实验发现,正常黄种人的Cr分量大约在140~·160之间

3)滤波,本实验采用性能较好的中值滤波

4)特征区域提取,利用matlab的bwlabel函数

5)对标记的特征区域利用高宽度之比和面积两个指数来进一步简化特征区域

 

具体实验代码及原理讲解

1)rgb->ycbcr

%公式 Y = 0.2990*R + 0.5780*G + 0.1140*B + 0 
%公式 Cr = 0.5000*R - 0.4187*G - 0.0813*B + 128 
%公式 Cb = -0.1687*R - 0.3313*G + 0.5000*B + 128

(参见http://en.wikipedia.org/wiki/YCbCr)

本实验直接采用mtalab自带函数rgb2ycbcr()转换就OK了。

I1=imread( 'blue_lg.jpg' );
si=size(I1);
m=si(1);n=si(2);
img1=rgb2ycbcr(I1);
cr1=img1(:,:,3);%大小为mxn的二维矩阵

  

2)阈值分割

cr3=cr1;
for  i=1:m
for  j=1:n
if (cr3(i,j)>140&&cr3(i,j)<160)%140~160为本人实验多次得到的合理值
       cr3(i,j)=255;
else
       cr3(i,j)=0;
end
end
end

3)中值滤波器(本实验采用的是5x5的子模板)

c_r=cr3;
for  i=3:m-2
     for  j=3:n-2;
         temp=cr3(i-2:i+2,j-2:j+2);%提取5x5区域
         temp1=sort(temp);%排序
         c_r(i,j)=temp1(13);%中值
     end
end

4)利用bwlabel进行特征区域提取

关于matlab函数bwlabel:[L, num] = bwlabel(BW, n);

根据领域的链接性质,将整个区域分为num个子区域,L为一矩阵,其中每个子区域在此矩阵中的值为子区域的序号。值得注意的是,序号为0的情况(我理解为背景,直接弃之不用)。n指的是领域性质,4邻域or8邻域。

举个例子,

BW = logical ([1     1     1     0     0     0     0     0
               1     1     1     0     1     1     0     0
               1     1     1     0     1     1     0     0
               1     1     1     0     0     0     1     0
               1     1     1     0     0     0     1     0
               1     1     1     0     0     0     1     0
               1     1     1     0     0     1     1     0
               1     1     1     0     0     0     0     0]);
3种背景颜色分别表示3个子区域,剩下的即为区域0,理解为背景吧。
对应生成的L矩阵即为
% L = bwlabel(BW,4);

L =

     1     1     1     0     0     0     0     0
     1     1     1     0     2     2     0     0
     1     1     1     0     2     2     0     0
     1     1     1     0     0     0     3     0
     1     1     1     0     0     0     3     0
     1     1     1     0     0     0     3     0
     1     1     1     0     0     3     3     0
     1     1     1     0     0     0     0     0
(参考mtlab自带文档)

我的做法是在当前路径下重新定义了一个子函数findlimit()。

function [l,kk]=findlimit(I)
%l为已分类有序矩阵
%kk为特征区域的序号
 
tt=size(size(I));
if  tt(2)==3  %若I为3维矩阵,则需要转换为灰度图像
     J=rgb2gray(I);
else         %I为3维矩阵
     J=I;
end
 
%[m,n]=size(J);
 
[l,num]=bwlabel(J,8);
area=zeros(1,num+1);%面积
zhonghengbi=zeros(1,num+1);%比例
%re=zeros(num+1,4);
re1=zeros(num+1,2);
for  k=0:num
     [r,c]= find(l==k);
      % re(k+1,1)=min(r);     %垂直方向最小值(上)
      % re(k+1,2)=max(r);    %垂直方向最大值(下)
      % re(k+1,3)=min(c);     %水平方向最小值(左)
      % re(k+1,4)=max(c);    %水平方向最大值(右)
      re1(k+1,1)=max(r)-min(r);%高度
      re1(k+1,2)=max(c)-min(c);%宽度
      zhonghengbi(k+1)=re1(k+1,1)/re1(k+1,2);%高宽比
      if (re1(k+1,2)==0) zhonghengbi(k+1)=0;end%防止出现单条垂直线的情况
      area(k+1)=re1(k+1,1)*re1(k+1,2);
end
 
j=1;
for  i=1:num+1
     if  zhonghengbi(i)>0.2&&zhonghengbi(i)<3.0&&area(i)>1000
%高宽比设置为0.2~3.0之间,面积认为大于1000,注意面积为随机项,与图片大小有很大的关系
        kk(j)=i-1;
        j=j+1;
     end
end

5)把特征区域整个提取出来

在此之前定义了一个判断序号是否在提取出的特征区域内的isson()函数,如下:

function x=isson(y,I)
x=0;
z=size(I);
for  i=1:z(2)
     if (y==I(i))
         x=1;
         break ;
     end
end

  

[l,kk]=findlimit(c_r);
J=l;
for  i=1:m
     for  j=1:n
     if (l(i,j)~=0&&isson(l(i,j),kk)==1)
         J(i,j)=255;
     else
         J(i,j)=0;
     end
     end
end
figure;imshow(J,[]);

然后就可以达到最后的人脸头像了。

原始图像:

处理后

 

2原始图像

处理后:

 

到这里,本文即将完结,但是可能大家都注意到,许多图像之中,由于手臂的肤色与人脸一致,以及背景不可避免的颜色巧合,导致最终的效果不是特别理想。

这里主要讨论手与脸的区分问题(考虑使用类圆相似度来解决,可能在下一篇中解决,当然这是后话)。

 

转载请标明http://www.cnblogs.com/blue-lg/archive/2011/12/07/2279879.html

<think>我们根据用户的需求,整合一个基于YCrCb颜色模型的人脸检测MATLAB代码。主要步骤包括:1.读取图像并转换为YCrCb颜色空间。2.根据肤色在Cr和Cb分量的范围创建掩码(mask)。3.对掩码进行形态学操作(开运算和闭运算)以去除噪声和填充空洞。4.利用掩码提取肤色区域,并标记在原始图像上(例如将肤色区域设置为白色)。5.显示结果。注意:用户提供的阈值范围是Cr:[133,173],Cb:[77,127]。但要注意,这个范围可能因图像和光照条件而变化,可能需要调整。另外,我们还可以考虑使用连通区域分析来进一步确定人脸区域(例如通过区域面积、圆形度等特征来筛选)。根据引用[1]的提示,我们可以结合其他特征(如几何特征)来提高准确性,但本代码主要基于颜色模型。我们将编写一个函数,输入为图像文件名和缩放比例(根据引用[3]中的提示,用户可能需要缩放图像以提高处理速度和效果)。代码结构如下:-读取图像,并按比例缩放。-转换为YCrCb。-创建肤色掩码。-形态学处理。-标记肤色区域(或直接显示掩码区域)。-显示结果。注意:由于手臂等部位也可能被检测肤色,我们这里只做基础的肤色分割,不进行人脸区域的精确判定(如需要,可后续添加基于形状或机器学习的分类器)。我们按照用户要求,使用MATLAB代码实现。</think>### MATLAB实现基于YCrCb颜色模型的人脸检测代码整合 以下是一个完整的MATLAB实现方案,整合了YCrCb颜色模型的人脸检测流程: ```matlab function detectFace_YCrCb(imgPath, scaleFactor) % 读取并预处理图像 I = imread(imgPath); I = imresize(I, scaleFactor); % 转换为YCrCb颜色空间 img_ycrcb = rgb2ycbcr(I); Y = img_ycrcb(:, :, 1); Cr = img_ycrcb(:, :, 2); Cb = img_ycrcb(:, :, 3); % 创建肤色掩码(可调整的阈值范围) skin_mask = (Cr >= 133) & (Cr <= 173) & ... (Cb >= 77) & (Cb <= 127); % 形态学优化(参考引用[2]的噪声处理思想) se = strel('disk', round(5*scaleFactor)); % 自适应结构元素大小 skin_mask = imopen(skin_mask, se); % 开运算去噪 skin_mask = imclose(skin_mask, se); % 闭运算填充空洞 % 连通区域分析(参考引用[1]的几何特征思想) cc = bwconncomp(skin_mask); stats = regionprops(cc, 'Area', 'BoundingBox'); % 筛选人脸区域(基于面积和宽高比) minFaceArea = 500 * scaleFactor^2; % 最小人脸面积阈值 faceBoxes = []; for k = 1:length(stats) area = stats(k).Area; bbox = stats(k).BoundingBox; aspectRatio = bbox(3)/bbox(4); % 典型人脸宽高比范围0.6-1.2 if area > minFaceArea && aspectRatio > 0.6 && aspectRatio < 1.2 faceBoxes = [faceBoxes; bbox]; end end % 可视化结果 figure; imshow(I); hold on; for i = 1:size(faceBoxes,1) rectangle('Position', faceBoxes(i,:), ... 'EdgeColor','r', 'LineWidth',2); end title(sprintf('检测到%d个人脸', size(faceBoxes,1))); hold off; end ``` ### 使用说明: 1. **函数调用**: ```matlab % 检测图像中的人脸(0.5表示缩小50%处理) detectFace_YCrCb('test.jpg', 0.5); ``` 2. **参数调整**: - `scaleFactor`:图像缩放比例(加速处理) - 肤色阈值范围:根据实际光照和肤色调整`Cr/Cb`范围 - `minFaceArea`:根据图像分辨率调整最小人脸面积 3. **优化建议**: - **多肤色适应**:对不同肤色人群,建立动态阈值调整机制 - **光照补偿**:添加直方图均衡化预处理 - **混合检测**:结合Haar特征分类器提高准确性(参考引用[1]) ```matlab % 示例:添加直方图均衡化 I_eq = histeq(I); img_ycrcb = rgb2ycbcr(I_eq); ``` ### 技术要点解析: 1. **颜色空间转换**: - 使用`rgb2ycbcr`函数实现RGB到YCrCb的转换 - 肤色在Cr-Cb平面聚类特性明显($C_b \in [77,127]$, $C_r \in [133,173]$) 2. **形态学优化**: - 开运算(`imopen`)消除小噪声点 - 闭运算(`imclose`)填充肤色区域空洞 - 自适应结构元素大小:`strel('disk', size)`随图像缩放调整 3. **人脸验证**: - **面积筛选**:排除小面积噪声区域 - **宽高比约束**:利用人脸几何特征(宽高比≈1) $$ \text{aspectRatio} = \frac{\text{width}}{\text{height}} \approx 1 $$ 4. **性能优化**: - 图像缩放加速处理 - 连通区域分析替代全图遍历 > **注意**:对于复杂背景图像,建议结合深度学习模型(如YOLO)进行二次验证,参考引用[1]的机器学习方法[^1]。 --- ### 效果对比示例: | 原图 | 肤色掩码 | 检测结果 | |------|----------|----------| | ![原图](https://example.com/orig.jpg) | ![掩码](https://example.com/mask.jpg) | ![结果](https://example.com/result.jpg) | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值