【Matlab】基于皮肤概率建模的人脸检测算法雏形

原理

通过色度计算图像中每个像素点是皮肤的概率,当概率大于某一值时就确定这个像素点是皮肤,并将它涂白,其余不是皮肤的像素点涂黑;对图像做适当处理后,把图像中不是脸部皮肤的区域分割开,随后把脸部特征还原即可得到图像的脸部皮肤区域。至此人脸检测完毕。

实现

%清屏、清理工作空间中的所有变量、关闭所有窗口
clc;
clear all;
close all;
%读取图片
im_RGB=imread('1.jpg');

%第一步:计算图片中每个像素点是皮肤的概率
im_YCrCb=rgb2ycbcr(im_RGB);%把彩色图片从RGB空间转换到YCbCr色彩空间
[a,b,c]=size(im_YCrCb);
cb=double(im_YCrCb(:,:,2));%获取图片的蓝色色度
cr=double(im_YCrCb(:,:,3));%获取图片的红色色度
Ecb=(cb-117.4316);%117.4316为肤色蓝色色度的均值
Ecr=(cr-114.5599);%114.5599为肤色红色色度的均值
prob=exp((-0.0019)*Ecb.^2+(0.0004)*(Ecb).*(Ecr)+(-0.0033)*Ecr.^2);%计算概率
im_BW=prob./max(max(prob));%概率归一化

%第二步:将概率超过域值的点涂白,低于域值的点涂黑
th=0.4;%设定域值为0.4
for i=1:a
    for j=1:b
        if(im_BW(i,j)>th)
            im_BW(i,j)=0;%涂白
        else
            im_BW(i,j)=1;%涂黑
        end
    end
end
%显示经过一二两步处理的图像
subplot(2,2,1);
imshow(im_BW);
title('Set threshold');

%第三步:对图像做数学形态学处理
se=strel('square',3);%3×3方阵内粗处理
    im_Region=imopen(im_BW,se);%开运算(先膨胀后腐蚀)
    im_Region=imclose(im_Region,se);%闭运算(先腐蚀后膨胀)
    im_Region=imfill(im_Region,'holes');%填洞
se1=strel('square',8);%8×8方阵内精处理
    im_Region=imerode(im_Region,se1);%腐蚀
    im_Region=imdilate(im_Region,se1);%膨胀

%第四步:将脸部以外的皮肤分割开
[im_Face,num]=bwlabel(im_Region,4);%获取所有4连通区域
%从第一个连通区域开始判断该区域是否为脸部皮肤
for i=1:num
    [r,c]=find(im_Face==i);%第i个连通区域
    len=max(r)-min(r)+1;%连通区域长度
    wid=max(c)-min(c)+1;%连通区域宽度
    area_sq=len*wid;%连通区域面积
    area=size(r,1);%连通区域像素点个数
    %开始判断
    for j=1:size(r,1)
        if (len/wid<0.8)|(len/wid>2.4)|area<3000|area/area_sq<0.65
            im_Face(r(j),c(j))=0;%将不是人脸皮肤的像素点涂黑
        else
            continue;
        end
    end
end
%显示经过三四两步处理的图像
subplot(2,2,2);
imshow(im_Face);
title('Face Region');
%显示将人脸特征加入后的图像
im_Feature=im_Face&im_BW;
subplot(2,2,3);
imshow(im_Feature);
title('Features points');

%第五步:框选人脸区域
[r c]=find(im_Face~=0);
r_min=min(r);
r_max=max(r);
c_min=min(c);
c_max=max(c);
%显示框选人脸后的图像
subplot(2,2,4);
imshow(im_RGB);
title('Detection result');
rectangle('Position',[c_min r_min c_max-c_min r_max-r_min],'EdgeColor','r');

效果

算法效果

缺陷

该算法在单一人脸、简单场景下人脸检测准确率较高,但是该算法无法适应复杂的场景,场景变换后需要手动调节参数才能实现多人脸、复杂场景的人脸检测。

注:该算法改编自《人脸识别原理与实战》第一章第三阶段的人脸检测算法。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值