基于肤色的人脸检测

转载网址:http://blog.163.com/facerec_wyu/blog/static/16813110620107864936482/

一个颜色空间,是由三种基色基色构成。计算机存储彩色照片是以三个平面矩阵数据结构来保存照片的信息的。其中每个平面矩阵里的数值代表一个颜色空间的一种基色值——像素值。平面矩阵里的元素与照片像素位置一一对应,由三个平面矩阵里的像素值按固定规律组合起来,就能代表各种颜色。

    人的皮肤有着特征性的颜色,能跟外界背景较明显地区分开来。因而,皮肤的颜色在颜色空间的基色中,只占据一定的范围,算出这个范围的值,就能把皮肤从背景中过滤出来。例如,在NTSC颜色空间中,肤色在第二个平面矩阵里的像素值,大都集中在0.03—0.2这个范围内,把第二个平面矩阵里的提取出来,再转成二值图像,把0.03—0.2范围内的值都转成白色,其他值转成黑色,这样就能皮肤过滤出来。

从过滤出来的皮肤中,脸部皮肤在照片中,有着一定的位置与外形规律,就能把脸部皮肤再分割出来。脸部皮肤包含着眼睛的位置,而眼睛与皮肤有着明显的不同。把分割出来的脸部皮肤转成二值图像后,皮肤与眼睛就能很好地区分开,即白色的皮肤包含着黑色的眼睛。只要算出黑色的部分的质心坐标,此坐标,即眼睛的位置。此时,算出来的质心不只两个,会有眉毛、鼻子、嘴巴等质心的干拢。可以得用双眼在脸部所固有位置规律,就能把两眼的质心选择出来。

% 只能检测一张脸
clear all; 
close all; 
clc; 
I=imread('FaceDetect1.png');
O=rgb2ntsc(I);
G=O(:,:,2);
[m n]=size(G);
U=zeros(m,n);
for i=1:m
    for j=1:n
        if G(i,j)>0.03&&G(i,j)<0.16
            U(i,j)=1;
        end
    end
end
sr=strel('disk',6); % 形态学算子
C=imclose(U,sr);    % 闭运算
figure;
imshow(C,[]);
title('二值化结果');
L=bwlabel(C);
B=regionprops(L,'area'); % 计算二值图像的面积
Se=[B.Area];Sm=max(Se);  % 最大面积区域
Threshold = 27;          % 人脸的最小面积
if Sm>m*n/Threshold
    B1=bwareaopen(C,Sm); % 删除面积小于Sm的值
    figure;
    imshow(B1,[]);
    title('删除部分小区域后的结果');
    k_y1=m;k2=m;l2=n;
    for i=1:m
        if any(B1(i,:))==1
            k_y1=i;
            break
        end
    end
    for i=k_y1:m
        if B1(i,:)==0
            k2=i;
            break
        end
    end
    for j=1:n
        if any(B1(:,j))==1
            l_y1=j;
            break
        end
    end
    for j=l_y1:n
        if B1(:,j)==0
            l2=j;
            break
        end
    end
    k_y=k2-k_y1;
    l=l2-l_y1;
    % 画框
    if k_y>.5*l&&k_y<3*l
        I1=imcrop(B1,[l_y1 k_y1 l .4*k_y]);
        [n1 m1]=size(I1);
        L1=bwlabel(I1);
        E=regionprops(L1,'area');
        Si=[E.Area];
        Sm=max(Si);
        if Sm/(n1*m1)>.3
            B2=bwareaopen(I1,floor(.5*Sm));
            g_y1=m1;g2=m1;
            for j=1:m1
                if any(B2(:,j))==1
                    g_y1=j;
                    break
                end
            end
            for j=g_y1:m1
                if B2(:,j)==0;
                    g2=j;break
                end
            end
            g=g2-g_y1;
            figure;imshow(I);
            hold on
            h1=line([l_y1+g_y1,l_y1+g_y1+g],[k_y1,k_y1]);
            h2=line([l_y1+g_y1+g,l_y1+g_y1+g],[k_y1,k_y1+1.1*g]);
            h3=line([l_y1+g_y1+g,l_y1+g_y1],[k_y1+1.1*g,k_y1+1.1*g]);
            h4=line([l_y1+g_y1,l_y1+g_y1],[k_y1+1.1*g,k_y1]);
            h=[h1 h2 h3 h4];
            set(h,'Color',[1 0 0],'LineWidth',2);
        else
            figure;imshow(I);
        end
    else
        figure;imshow(I);
    end
else
    figure;imshow(I);
end

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值