现在时间是:
当前位置:首 页 >> 数学建模实训>> 教学区>> 文章列表

16074307 汪丽琼 数学建模实训 作业3

作者:   发布时间:2018-12-29 22:56:30   浏览次数:43

人脸识别

 

1基本原理

基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来,在函数skinvalue值大于1则不是肤色,返回0;否则为肤色,返回1

2 算法思路

作业中的这个程序代码是简单的人脸识别小代码,功能更也比较简单,优点是运行的速度比较快,操作简单,识别率是比较高的;缺点就是代码简单,目前只能识别一张相应的照片,判别这张照片是否是人脸。

这个人脸识别程序主要包含三个程序模块,第一,将图像转化为YCbCr颜色空间,根据色彩模型进行图像二值化,二值化图像进行形态学处理、开运算,显示二值图像;第二,采用标记方法选取出图中的白色区域,度量区域属性,存放经过筛选以后得到的所有矩形块,筛选特定区域,存储人脸的矩形区域;第三,对于所有人脸的矩形区域,如果满足条件的矩形区域大于1则再根据其他信息进行筛选,标记最终的人脸区域。

图像分割程序中,利用肤色可以较为精确的将人脸和非人脸区域分割开来,得到较为精确的二值化图像。

人脸的确认程序,以存储的所有矩形区域作为研究对象,当区域内有眼睛存在时,才认为此区域为人脸区域。

3 执行流程

 

 

4 图片运行结果

 

作业过程中,发现很多模型的建立都采用了YCbCr色彩空间,原理相似,算法大相径庭,作业的局限性在于只能加载一张图片,但这个过程也是比较艰难,运行时间大约在5分钟左右,算法思想中有着大智慧。

 


5  作业代码

function result = skin(Y,Cb,Cr)

%SKIN Summary of this function goes here

%Detailed explanation goes here

a=25.39;

b=14.03;

ecx=1.60;

ecy=2.41;

sita=2.53;

cx=109.38

cy=152.02;

xishu=[cos(sita) sin(sita);-sin(sita) cos(sita)];

%如果亮度大于230,则将长短轴同时扩大为原来的1.1

if(Y>230)

a=1.1*a;

b=1.1*b;

end

%根据公式进行计算

Cb=double(Cb);

Cr=double(Cr);

t=[(Cb-cx);(Cr-cy)];

temp=xishu*t;

value=(temp(1)-ecx)^2/a^2+(temp(2)-ecy)^2/b^2;

%大于1则不是肤色,返回0;否则为肤色,返回1

if value>1

result=0;

else

result=1;

end

end

 

 

function eye = findeye(bImage,x,y,w,h)

%FINDEYE Summary of this function goes here

%   Detailed explanation goes here part=zeros(h,w); %二值化

for i=y:(y+h)

for j=x:(x+w)

if bImage(i,j)==0

part(i-y+1,j-x+1)=255;

else

part(i-y+1,j-x+1)=0;

end

end

end

[L,num]=bwlabel(part,8);

%如果区域中有两个以上的矩形则认为有眼睛

if num<2

eye=0;

else

eye=1;

end

end

 

 

clear all;

%读入原始图像

I=imread('face3.jpg');

gray=rgb2gray(I);

ycbcr=rgb2ycbcr(I);%将图像转化为YCbCr空间

heighth=size(gray,1);%读取图像尺寸

width=size(gray,2);

for i=1:heighth %利用肤色模型二值化图像

for j=1:width

Y=ycbcr(i,j,1);

Cb=ycbcr(i,j,2);

Cr=ycbcr(i,j,3);

if(Y<80)

gray(i,j)=0;

else

if(skin(Y,Cb,Cr)==1)%根据色彩模型进行图像二值化

gray(i,j)=255;

else

gray(i,j)=0;

end

end

end

end

se=strel('arbitrary',eye(5));%二值图像形态学处理

gray=imopen(gray,se);

figure;imshow(gray)

[L,num]=bwlabel(gray,8);%采用标记方法选出图中的白色区域

stats=regionprops(L,'BoundingBox');%度量区域属性

n=1;%存放经过筛选以后得到的所有矩形块

result=zeros(n,4);

figure,imshow(I);

hold on;

for i=1:num %开始筛选特定区域

box=stats(i).BoundingBox;

x=box(1);%矩形坐标X

y=box(2);%矩形坐标Y

w=box(3);%矩形宽度w

h=box(4);%矩形高度h

ratio=h/w;%宽度和高度的比例

ux=uint16(x);

uy=uint8(y);

if ux>1

ux=ux-1;

end

if uy>1

uy=uy-1

; end

if w<20 || h<20|| w*h<400 %矩形长宽的范围和矩形的面积可自行设定

continue

elseif ratio<2 && ratio>0.6 && findeye(gray,ux,uy,w,h)==1

%根据三庭五眼规则高度和宽度比例应该在(0.6,2)内;

result(n,:)=[ux uy w h];

n=n+1;

end

end
if size(result,1)==1 && result(1,1)>0 %
对可能是人脸的区域进行标记

rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4)],'EdgeColor','r');

else

%如果满足条件的矩形区域大于1,则再根据其他信息进行筛选

a=0;

arr1=[];arr2=[];

for m=1:size(result,1)

m1=result(m,1);

m2=result(m,2);

m3=result(m,3);


 

 

 

 







上一篇:没有了    下一篇:没有了

Copyright ©2019    计算数学达人 All Right Reserved.

技术支持:自助建站 | 领地网站建设 |短信接口 |燕窝 版权所有 © 2005-2019 lingw.net.粤ICP备16125321号 -5