matlab编程--基于肤色分割和匹配的人脸识别介绍
基于-MATLAB的肤色分割和匹配的人脸识别研究

.毕业设计(论文)题目:基于肤色分割和匹配的人脸识别算法研究系别信息工程系专业名称通信工程班级学号 098204233学生姓名张翀指导教师李忠民二O一三年五月毕业设计(论文)任务书I、毕业设计(论文)题目:基于肤色分割和匹配的人脸识别算法研究II、毕业设计(论文)使用的原始资料(数据)及设计技术要求:为了把人脸区域从非人脸区域分割出来,需要使用适合不同肤色和不同光照条件的可靠肤色模型。
基于肤色分割和匹配的人脸识别算法研究主要运用Matlab软件编程实现对人脸图像进行图像转换、消除噪声、填孔处理、图像重构和边缘检测,从而实现基于肤色分割和匹配的人脸识别算法。
具体要求如下:1、基于肤色分割和匹配的人脸识别的一般过程;2、采用Matlab实现图像转换、消除噪声、填孔处理、图像重构和边缘检测等相关算法;3、比较各种算法的处理效果;4、采用Matlab实现基于肤色分割和匹配的人脸识别算法;5、翻译一篇相关的英文资料。
I I I、毕业设计(论文)工作内容及完成时间:第01~03周:资料查找、方案论证、英文资料翻译、开题报告撰写;第04~11周:基于肤色分割和匹配的人脸识别算法设计;编写程序、仿真测试;第12~15周:对比测试;第16~18周:毕业论文撰写,答辩。
Ⅳ、主要参考资料:[1].[美]恩格尔W K. Digital Signal Processing Using MATLAB [M]. 西安:西安交通大学出版社,2002[2].[美] Nakamura S. Numerical Analysis and Graphic Visualization withMATLAB(Second Edition) [M].北京:电子工业出版社,2002[3]. [美]冈萨雷斯.数字图像处理(MATLAB版)[M]. 北京:电子工业出版社,2005[4]. [美]冈萨雷斯.数字图像处理(第二版)[M]. 北京:电子工业出版社,20072007[5]. 张化光,刘鑫蕊,孙秋野.MATLAB/SIMULINK实用教程[M].北京:人民邮电出版社, 2011[6]. 刘文达,胡荣强. 基于肤色和模板匹配模型的人脸识别新方法研究[J]. 信息科技,2008:144-145[7]. 谢毓湘,王卫威,栾悉道等. 基于肤色与模板匹配的人脸识别[J]. 计算机工程与科学,2008,30(6): 54-56,69信息工程系电子信息工程专业类0982042 班学生(签名):填写日期:2013年 1 月10 日指导教师(签名):助理指导教师(并指出所负责的部分):电子信息工程系主任(签名):学士学位论文原创性声明本人声明,所呈交的论文是本人在导师的指导下独立完成的研究成果。
matlab编程--基于肤色分割和匹配的人脸识别介绍

基于肤色分割和匹配的人脸识别1.将RGB空间转换为YCbCr空间:为了把人脸区域从非人脸区域分割出来,需要使用适合不同肤色和不同光照条件的可靠的肤色模型。
常用的RGB 表示方法不适合于皮肤模型,在RGB 空间,三基色(r、g、b)不仅代表颜色,还表示了亮度。
由于周围环境光照的改变,亮度可能使人脸的检测变得更加复杂,在皮肤的分割过程中是不可靠的。
为利用肤色在色度空间的聚类性,需要把颜色表达式中的色度信息与亮度信息分开,将R、G、B 转换为色度与亮度分开的色彩表达空间可以达到这个目的。
颜色空间的转换常用的颜色模型主要有:YCrCb、HSV、YIQ等。
在本文的实验中选用YCrCb 空间作为肤色分布统计的映射空间,该空间的优点是受亮度变化的影响较小,而且是两维独立分布,能较好地限制肤色分布区域。
使用函数为:YCBCR = rgb2ycbcr(RGB);2.将彩色图像转换为灰度图像,实验证明,不同的肤色具有相同的2D模型G(m,V^2)。
灰度值对应属于皮肤区域的可能性,同过设定门限,就可以转换为二值图像,1,0分别表示皮肤和非皮肤区域。
皮肤颜色在ycbcr色度空间的分布范围为:100<=cb<=127,138<=cr<=170,可以将彩色图像转换为二值图像:f_cb=f(:,:,2);f_cr=f(:,:,3);f = (f_cb>=100) & (f_cb<=127) & (f_cr>=138) &(f_cr<=170) ;figure; imshow(f);3.转换后不可避免出现了噪声,有背景的噪声影响,以及人的衣服和裤子引起的噪声点,使用开闭运算的方法消除噪声:se=strel('square',3);f=imopen(f,se);f=imclose(f,se);figure(2),imshow(f);4.对图像做填孔处理f=imfill(f,'holes');figure(3),imshow(f);5.对图像进行重构,即利用重构进行开运算,可准确恢复腐蚀后的对象形状. fe=imerode(f,ones(8,7));fo=imopen(f,ones(8,7));f=imreconstruct(fe,f);figure(4),imshow(f);6.相关匹配,实际作用效果不大,可以注释掉. %w=ones(3);%f=imfilter(f,w);%figure(5),imshow(f);% [M,N]=size(f);% f=fft2(f);% w=conj(fft2(w,M,N));% g=real(ifft2(w.*f));% gs=gscale(g);% figure,imshow(gs);7.人脸候选区筛选时,由于头部部分重合,以及头部与其他部分,例如衣服等的连接,对筛选造成了困难,故应先利用闭运算操作,断开连接,再进行处理.se1=strel('square',8);f=imerode(f,se1);f=imdilate(f,se1);figure(6),imshow(f);8. 利用人脸候选区筛选,进一步确定人脸区域(判断规则如下):(1)若目标高宽比小于0.8而大于2.0,则认为不是人脸区域,删除此区域。
【谷速软件】matlab源码-人脸识别

1、介绍人物识别是智能互动中最重要的功能之一。
无论是作为人与人交往的助手(例如记忆助手,告诉记忆不好的人他正在和谁说话),还是在人与机器的互动中(例如一台机器,辨认其用户并且定制相应的偏好),它都提供了自然相互作用和个性化最重要的特征。
除此之外,通过促进人特定模型的使用,一个人的身份可以用于改善其它的感知技术系统的性能,比如描述分析系统,以外貌为基础的头部位置测定系统。
在所有的人物识别方法中,面部识别和声音识别是已知的最自然的识别方法,因为面部和声音是我们日常生活中辨别他人最常用到的方法。
虽然其他方法如指纹识别,可以提供较好的性能,但由于他的侵入性他们并不适合用于自然的智能互动。
声音识别系统的优点是它可以在识别系统没办法看到被识别人的地方通过一根电线进行身份识别。
与此相反,人脸识别提供被动识别,也就是说被识别的人不需要配合或者说做什么具体的动作。
例如,当客户进入商店的时候智能系统就可以辨认其固定的客户,这样客户就不必为了被识别出来而对着照相机说话或者直视照相机。
在互动研究中心,我们把已经开发智能互动的应用程序分为两组:1)用于智能环境的面部识别:此应用程序的识别任务是在稳定的场所实施的。
例如,在智能家庭中,家庭成员正在进入房子的时候他们可以被识别出来。
此应用程序不需要被识别的人合作,也不需要在一个被束缚的状态,更没有头部姿势,光线,佩戴饰物等的限制。
2)用于智能机器的面部识别:在这个应用中,一个智能机器识别它的使用者。
比如,一辆汽车识别它的司机,或者一个笔记本电脑识别它的用户。
在这个应用中,由于使用者经常性的标准动作,所以在机器和人之间存在着一个默契的配合,比如司机看路的动作和电脑用户看屏幕的动作。
因此在这样的系统中,头部姿势的变化是有限的。
由于环境条件经常变化,因此这个系统的难度较前者有所提高了。
在本文中,我们首先介绍一下以局部外貌为基础的面部识别算法,然后我们再介绍三种基于此算法的全自动面部识别系统。
人脸识别核心算法及MATLAB代码

人脸识别核心算法在检测到人脸并定位面部关键特征点之后,主要的人脸区域就可以被裁剪出来,经过预处理之后,馈入后端的识别算法。
识别算法要完成人脸特征的提取,并与库存的已知人脸进行比对,完成最终的分类。
我们在这方面的主要工作包括:∙基于LGBP的人脸识别方法问题:统计学习目前已经成为人脸识别领域的主流方法,但实践表明,基于统计学习的方法往往会存在“推广能力弱”的问题,尤其在待识别图像“属性”未知的情况下,更难以确定采用什么样的训练图像来训练人脸模型。
鉴于此,在对统计学习方法进行研究的同时,我们还考虑了非统计模式识别的一类方法。
思路:对于给定的人脸图像,LGBP方法首先将其与多个不同尺度和方向的Gabor滤波器卷积(卷积结果称为Gabor特征图谱)获得多分辨率的变换图像。
然后将每个Gabor特征图谱划分成若干互不相交的局部空间区域,对每个区域提取局部邻域像素的亮度变化模式,并在每个局部空间区域内提取这些变化模式的空间区域直方图,所有Gabor特征图谱的、所有区域的直方图串接为一高维特征直方图来编码人脸图像。
并通过直方图之间的相似度匹配技术(如直方图交运算)来实现最终的人脸识别。
在FERET四个人脸图像测试集合上与FERET97的结果对比情况见下表。
由此可见,该方法具有良好的识别性能。
而且LGBP方法具有计算速度快、无需大样本学习、推广能力强的优点。
参见ICCV2005表.LGBP方法与FERET'97最佳结果的对比情况∙基于AdaBoost的Gabor特征选择及判别分析方法问题:人脸描述是人脸识别的核心问题之一,人脸识别的研究实践表明:在人脸三维形状信息难以准确获取的条件下,从图像数据中提取多方向、多尺度的Gabor特征是一种合适的选择。
使用Gabor特征进行人脸识别的典型方法包括弹性图匹配方法(EGM)和Gabor特征判别分类法(GFC)。
EGM在实用中需要解决关键特征点的定位问题,而且其速度也很难提高;而GFC则直接对下采样的Gabor特征用PCA降维并进行判别分析,尽管这避免了精确定位关键特征点的难题,但下采样的特征维数仍然偏高,而且简单的下采样策略很可能遗漏了非常多的有用特征。
人脸识别MATLAB代码

人脸识别MATLAB代码第一篇:人脸识别MATLAB代码1.色彩空间转换function[r,g]=rgb_RGB(Ori_Face)R=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_ Face(:,:,3);R1=im2double(R);% 将uint8型转换成double型G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;row=size(Ori_Face,1);% 行像素 column=size(Ori_Face,2);% 列像素 for i=1:row for j=1:columnrr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);end end rrr=mean(rr);r=mean(rrr);ggg=mean(gg);g=mean(ggg);2.均值和协方差t1=imread('D:matlab皮肤库1.jpg');[r1,g1]=rgb_RGB(t1);t2=imread('D:matlab皮肤库2.jpg');[r2,g2]=rgb_RGB(t2);t3=imread('D:matlab皮肤库3.jpg');[r3,g3]=rgb_RGB(t3);t4=imread('D:matlab皮肤库4.jpg');[r4,g4]=rgb_RGB(t4);t5=imread('D:matlab皮肤库5.jpg');[r5,g5]=rgb_RGB(t5);t6=imread('D:matlab皮肤库6.jpg');[r6,g6]=rgb_RGB(t6);t7=imread('D:matlab皮肤库7.jpg');[r7,g7]=rgb_RGB(t7);t8=imread('D:matlab皮肤库8.jpg');[r8,g8]=rgb_RGB(t8);t9=imread('D:matlab皮肤库9.jpg');[r9,g9]=rgb_RGB(t9);t10=imread('D:matlab皮肤库10.jpg');[r10,g10]=rgb_RGB(t10);t11=imread('D:matlab皮肤库11.jpg');[r11,g11]=rgb_RGB(t11);t12=imread('D:matlab皮肤库12.jpg');[r12,g12]=rgb_RGB(t12);t13=imread('D:matlab皮肤库13.jpg');[r13,g13]=rgb_RGB(t13);t14=imread('D:matlab皮肤库14.jpg');[r14,g14]=rgb_RGB(t14);t15=imread('D:matlab皮肤库15.jpg');[r15,g15]=rgb_RGB(t15);t16=imread('D:matlab皮肤库16.jpg');[r16,g16]=rgb_RGB(t16);t17=imread('D:matlab皮肤库17.jpg');[r17,g17]=rgb_RGB(t17);t18=imread('D:matlab皮肤库18.jpg');[r18,g18]=rgb_RGB(t18);t19=imread('D:matlab皮肤库19.jpg');[r19,g19]=rgb_RGB(t19);t20=imread('D:matlab皮肤库20.jpg');[r20,g20]=rgb_RGB(t20);t21=imread('D:matlab皮肤库21.jpg');[r21,g21]=rgb_RGB(t21);t22=imread('D:matlab皮肤库22.jpg');[r22,g22]=rgb_RGB(t22);t23=imread('D:matlab皮肤库23.jpg');[r23,g23]=rgb_RGB(t23);t24=imread('D:matlab皮肤库24.jpg');[r24,g24]=rgb_RGB(t24);t25=imread('D:matlab皮肤库25.jpg');[r25,g25]=rgb_RGB(t25);t26=imread('D:matlab皮肤库26.jpg');[r26,g26]=rgb_RGB(t26);t27=imread('D:matlab皮肤库27.jpg');[r27,g27]=rgb_RGB(t27);r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17 ,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27);g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g1 5,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27);m=mean( [r,g])n=cov([r,g])3.求质心function [xmean, ymean] = center(bw)bw=bwfill(bw,'holes');area = bwarea(bw);[m n] =size(bw);bw=double(bw);xmean =0;ymean = 0;for i=1:m, for j=1:n,xmean = xmean + j*bw(i,j);ymean = ymean + i*bw(i,j);end;end;if(area==0)xmean=0;ymean=0;elsexmean = xmean/area;ymean = ymean/area;xmean = round(xmean);ymean = round(ymean);end4.求偏转角度function [theta] = orient(bw,xmean,ymean)[m n] =size(bw);bw=double(bw);a = 0;b = 0;c = 0;for i=1:m, for j=1:n,a = a +(jxmean)*(iymean)^2 * bw(i,j);end;end;b = 2 * b;theta = atan(b/(a-c))/2;theta = theta*(180/pi);% 从幅度转换到角度 5.找区域边界function [left, right, up, down] = bianjie(A)[m n] = size(A);left =-1;right =-1;up =-1;down =-1;for j=1:n,for i=1:m,if(A(i,j)~= 0) left = j;break;end;end;if(left ~=-1)break;end;end;for j=n:-1:1, for i=1:m, if(A(i,j)~= 0)right = j;break;end;end;if(right ~=-1)break;end;end;for i=1:m, for j=1:n,if(A(i,j)~= 0) up = i;break;end;end;if(up ~=-1)break;end;end;for i=m:-1:1,for j=1:n,if(A(i,j)~= 0)down = i;break;end;end;if(down ~=-1)break;end;end;6.求起始坐标function newcoord = checklimit(coord,maxval)newcoord = coord;if(newcoord<1)newcoord=1;end;if(newcoord>maxval)newcoord=maxval;end;7.模板匹配function [ccorr, mfit, RectCoord] = mobanpipei(mult, frontalmodel,ly,wx,cx, cy, angle)frontalmodel=rgb2gray(frontalmodel);model_rot = imresize(frontalmodel,[ly wx],'bilinear');% 调整模板大小 model_rot = imrotate(model_rot,angle,'bilinear');% 旋转模板 [l,r,u,d] = bianjie(model_rot);% 求边界坐标 bwmodel_rot=imcrop(model_rot,[l u(r-l)(d-u)]);% 选择模板人脸区域 [modx,mody] =center(bwmodel_rot);% 求质心 [morig, norig] = size(bwmodel_rot);% 产生一个覆盖了人脸模板的灰度图像mfit = zeros(size(mult));mfitbw = zeros(size(mult));[limy, limx] = size(mfit);% 计算原图像中人脸模板的坐标 startx = cx-modx;starty = cy-mody;endx = startx + norig-1;endy = starty + morig-1;startx = checklimit(startx,limx);starty = checklimit(starty,limy);endx = checklimit(endx,limx);endy = checklimit(endy,limy);for i=starty:endy, for j=startx:endx,mfit(i,j)= model_rot(i-starty+1,j-startx+1);end;end;ccorr = corr2(mfit,mult)% 计算相关度 [l,r,u,d] = bianjie(bwmodel_rot);sx = startx+l;sy = starty+u;RectCoord = [sx sy(r-1)(d-u)];% 产生矩形坐标 8.主程序 clear;[fname,pname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.gif'},'Please choose a color picture...');% 返回打开的图片名与图片路径名 [u,v]=size(fname);y=fname(v);% 图片格式代表值switch ycase 0errordlg('You Should Load Image File First...','Warning...');case{'g';'G';'p';'P';'f';'F'};% 图片格式若是JPG/jpg、BMP/bmp、TIF/tif或者GIF/gif,才打开I=cat(2,pname,fname);Ori_Face=imread(I);subplot(2,3,1),imshow(Ori_Face);otherwiseerrordlg('You Should Load Image File First...','Warning...');end R=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R);% 将uint8型转换成double型处理G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;m=[ 0.4144,0.3174];% 均值 n=[0.0031,-0.0004;-0.0004,0.0003];% 方差 row=size(Ori_Face,1);% 行像素数 column=size(Ori_Face,2);% 列像素数 for i=1:rowfor j=1:columnif RGB(i,j)==0rr(i,j)=0;gg(i,j)=0;elserr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);x=[rr(i,j),gg(i,j)];p(i,j)=exp((-0.5)*(x-m)*inv(n)*(x-m)');endend endsubplot(2,3,2);imshow(p);low_pass=1/9*ones(3);image_low=filter2(low_pass, p);subplot(2,3,3);imshow(image_low);% 自适应阀值程序previousSkin2 = zeros(i,j);changelist = [];for threshold = 0.55:-0.1:0.05 two_value = zeros(i,j);two_value(find(image_low>threshold))= 1;change = sum(sum(two_valuel +1);% 宽度 ly =(d-u + 1);% 高度 wratio = ly/wx% 高宽比if((0.8<=wratio)&(wratio<=2))% 如果目标区域的高度/宽度比例大于0.8且小于2.0,则将其选出进行下一步运算S=ly*wx;% 计算包含此区域矩形的面积A=bwarea(bwsegment);% 计算此区域面积if(A/S>0.35)[ccorr,mfit, RectCoord] = mobanpipei(justface,frontalmodel,ly,wx, cx,cy, angle);endif(ccorr>=0.6)mfitbw=(mfit>=1);invbw = xor(mfitbw,ones(size(mfitbw)));source_with_hole = uint8(double(invbw).*double(imsourcegray));final_image = uint8(double(source_with_hole)+ double(mfit));subplot(2,3,5);imshow(final_image);% 显示覆盖了模板脸的灰度图像imsourcegray = final_image;subplot(2,3,6);imshow(Ori_Face);% 显示检测效果图end;if(RectCoord ~=-1)FaceCoord = [FaceCoord;RectCoord];endend end end% 在认为是人脸的区域画矩形[numfaces x] = size(FaceCoord);for i=1:numfaces,hd = rectangle('Position',FaceCoord(i,:));set(hd, 'edgecolor', 'y');end 人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。
基于matlab的彩色图像皮肤区域分割及人脸检测

目录第一章引言 (1)第二章算法理论与实现原理 (1)2.1肤色分割理论 (1)2.2常见肤色模型比较 (2)2.2.1 区域模型 (2)2.2.2 简单高斯模型 (2)2.2.3 混合高斯模型 (2)2.2.4 直方图模型 (3)2.3常见色彩空间比较 (3)2.3.1 RGB (3)2.3.2 HSV (4)2.3.3 YcbCr (4)第三章系统设计 (7)3.1建立肤色模型 (7)3.2肤色分割步骤 (8)第四章参考文献 (12)第五章心得体会 (12)第一章引言近年来,随着人工智能的快速发展,人脸识别技术逐渐成为模式识别与计算机视觉领域的一个研究热点,可用于身份认证、人员监视、图像数据库检索以及目标跟踪等场合。
人脸识别(Face Recognition)是将输入的人脸图像与系统已知人脸库中的模型进行比较,以确定是否存在相匹配的人脸,而人脸检测( Face Detection) 是指在输入图像中确定所存在的人脸的位置与大小,所以快速有效的人脸检测则显得至关重要,是实现人脸识别的前提和基础。
人脸检测系统要求实现对输入的可能包含人脸的图像进行处理,并输出图像中是否存在人脸以及人脸的数目、位置、尺度、位姿等参数信息。
传统的人脸检测方法大多是在亮度空间内进行,利用灰度的变化做多尺度空间的全搜索,计算量非常大、效率极低,而在人脸区域中,肤色一定是占主导地位的像素色彩值,虽然肤色因人而异,但经过研究可以发现肤色在色彩空间中的一定范围内是呈聚类特性的,特别是在排除了光照亮度和在经过变换的色彩空间中,利用肤色这一特征可以排除掉在灰度图像中的非皮肤区域,这对人脸检测起到了积极的作用。
第二章算法理论与实现原理2.1肤色分割理论肤色特征主要由肤色模型进行描述,而肤色模型的选取与色度空间(chrominance space)的选择密切相关。
人脸检测常用的色度空间主要RGB(红、绿、蓝三基色)、rgb(亮度归一化的三基色)、HSI(色调、饱和度、亮度)、YIQ(NTSC制的光亮度和色度模型)、YUV(PAL制的光亮度和色度模型)、YCbCr(CCIR601)编码方式的色度模型、CIEL(国际照明委员会提出的基于色度学的彩色模型)等。
基于Matlab和YCrCb颜色分割方法的人脸检测与匹配算法的实现

摘 要 比较 RGB、 HSV、 YCrCb 三种颜色分割方法的优缺点, ORL face database, and it was found that the algorithm has high 选择效果最好的 YCrCb 颜色分割方法对图像进行处理, 利用 robustness. YCrCb 颜色分割方法实现人脸图像的粗定位和细定位, 可以 Key words face detection;face recognition and matching;charac获得较高的成功率。采用特征脸算法构建样本图 像的特征 teristic face 脸, 计算其与训练图像特征向量的距离, 进而实现人脸 图像 的 识别匹配, 用 ORL 人脸数据库对算法的准确率进行检验, 1 引言 发现算法有较高的鲁棒性。 对人脸轮廓图像的研究最 早可以追溯到 1910 年, 之后 关键词 人脸检测 人脸识别匹配 特征脸 研究人员对人脸识别的探究不断深 入,从半自动化低识别 Implementation of Face Detection and Recognition Using 率逐步发展为全自动化高识别率。于近几年同样处于发展 Matlab and the YCrCb Color Segmentation Method // 趋势 的特 征识别方法 (如虹膜识别、 指纹识别等) 相比, 人脸 Fang Zhibin,Wang Bing,Zhang Chen'ge 识别具有样本采集方便、 隐蔽 , 识别 方式符合人的认知特点 Abstract Comparing the advantages and disadvantages of the 等优点。人脸识别的图像主要由正面、 倾斜、 侧面三种情况 three color segmentation methods of with RGB, 表 1 三种颜色分割方法对比 HSV, YCrCb, we choose 优点 缺点 the best YCrCb color 颜色空间 说明 segmentation method to RGB 颜 色 空 间 是 立方体 状 颜 色 空 process image. Using the 颜 色 分量 具有 相 关性 , 难 以 实现 间,由 于人类 视觉 由三基 色 红 、 绿 YCrCb color segmentaRGB 颜 色 空 间 使 用 范 围广 ,通过 亮 度的 变 化 判 断 肤 色 范 围 与 和 蓝 三 个 波 段 组成。 对 于 RGB 图 广 泛 应 用 于保 存图像 信息 等 确 定 肤 色 的 阈 值 范 围 。应 用 于人 tion method to roughly RGB 像 ,分别 分解 三个 方向 的分量, 判 方面, 具有独特的优越性。 脸 肤 色 分 析 、 肤 色 处 理的 效果 较 and precisely locate the 别 颜色 通道的 灰度 值大 小 , 实现 人 差。 face image can achieve 脸检测 。 higher success rate. Characteristic face algoHSV 颜色空间 是 柱状 彩色 空间, 其 建立 H 分量或 V 分量对灰 度 rithm was used to con反映 人类 观察色 彩的 方式 , 通过选 色 调 值 取 值 波 动 , 色 调 值 可能 变 图像 分 割 和 处 理, 色 调 不 随 struct characteristic face 取色 度 (H) 、 饱 和度 (S) 和亮度 (V) 化 很大, 即 会 出 现 奇 异 性问题 , 会 灰 度 改 变 而 改 变 。在 色 度分 HSV 等 反 应 色 彩 本质 特性 的 参 数 构 建 对 肤 色的 检 测 造 成 影响 。 当 亮 度 of sample image and 布发 散 的 情况下 , 对 图像 处 很高或很低时, 色调分量不稳定。 彩 色 空 间 ,较 RGB 颜 色 空 间 而 言 calculate the distance 理得到的分割 准确度较高。 更有利于图像的处理。 between the training image feature vector and YCrCb 颜 色 空 间 构 成 原 理 与 the characteristic face, YCrCb 颜 色 空 间降低 RGB 颜 色 向 转换 的过 程 较为 复 杂 ,通 常 图像 人类视觉感知过程相似, so as to realize the 量的非 正交 性, 是 有效的 复 合 色 彩 的保存形式为 RGB 格式,需要 建 YCrCb 色 彩 格 式 具有 与 其 他 recognition and match- YCrCb 视频标准。 由于颜色空间中有两个 立相 关的 转换关系 并 用一 定程 序 色彩格式如 HSV 色彩格式相 ing of face image. The 相 互正 交 或 者 近 似 正 交 的 颜 色 分 才 能 转化 为 YCrCb 颜 色 空 间 , 同 类 似 的 将色 彩 中 的 亮 度分量 量, 因而又被称为正交颜色 空间[1]。 时空间坐标表示形式复杂。 accuracy of the algo分离出来的优点。 rithm was inspect with
基于MATLAB的人脸识别源程序

基于MATLA酌人脸识别源程序1•色彩空间转换function [r,g]=rgb_RGB(Ori_Face)R=0ri_Face(:,:,1);G=0ri_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8 型转换成double型G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;row=size(Ori_Face, 1); %行像素column=size(Ori_Face,2); %列像素for i=1:rowfor j=1:columnrr(i,j)=R1(i,j)/RGB(i,j);gg(i,j)=G1(i,j)/RGB(i,j);endendrrr=mean(rr);r=mean(rrr);ggg=mean(gg);g=mean(ggg); 2•均值和协方差皮肤库\2・jpg');[r2,g2]=rgb_RGB(t2);皮肤库\3・jpg');[r3,g3]=rgb_RGB(t3);皮肤库\4・jpg');[r4,g4]=rgb_RGB(t4);皮肤库\5・jpg');[r5,g5]=rgb_RGB(t5);皮肤库\6・jpg');[r6,g6]=rgb_RGB(t6);皮肤库\7・jpg');[r7,g7]=rgb_RGB(t7);皮肤库\8・jpg');[r8,g8]=rgb_RGB(t8);皮肤库\9・jpg');[r9,g9]=rgb_RGB(t9);皮肤库\10・jpg');[r10,g10]=rgb_RGB(t10); 皮肤库\11・jpg');[r11,g11]=rgb_RGB(t11); 皮肤库\12・jpg');[r12,g12]=rgb_RGB(t12); 皮肤库\13・jpg');[r13,g13]=rgb_RGB(t13); 皮肤库\14・jpg');[r14,g14]=rgb_RGB(t14); 皮肤库\15・jpg');[r15,g15]=rgb_RGB(t15); 皮肤库\16・jpg');[r16,g16]=rgb_RGB(t16); 皮肤库\17・jpg');[r17,g17]=rgb_RGB(t17); 皮肤库\18・jpg');[r18,g18]=rgb_RGB(t18); 皮肤库\19・jpg');[r19,g19]=rgb_RGB(t19); 皮肤库\20・jpg');[r20,g20]=rgb_RGB(t20); 皮肤库\21・jpg');[r21,g21]=rgb_RGB(t21);皮肤库\24・jpg');[r24,g24]=rgb_RGB(t24);皮肤库\25・jpg');[r25,g25]=rgb_RGB(t25);皮肤库\26・jpg');[r26,g26]=rgb_RGB(t26);皮肤库\27・jpg');[r27,g27]=rgb_RGB(t27); r=cat(1,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18, r19,r20,r21,r22,r23,r24,r25,r26,r27);g=cat(1,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g1 8,g19,g20,g21,g22,g23,g24,g25,g26,g27);m=mean([r,g])n=cov([r,g])3•求质心function [xmean, ymean] = center(bw)bw=bwfill(bw,'holes');area = bwarea(bw);[m n] =size(bw);bw=double(bw);xmean =0; ymean = 0;for i=1:m,for j=1:n,xmean = xmean + j*bw(i,j);ymean = ymean + i*bw(i,j);end;end;if(area==0)xmean=0;ymean=0;elsexmean = xmean/area;ymean = ymean/area;xmean = round(xmean);ymean = round(ymean);end4.求偏转角度function [theta] = orient(bw,xmean,ymean) [m n] =size(bw); bw=double(bw);a = 0;b = 0;c = 0;for i=1:m,for j=1:n,a = a + (j - xmean)A2 * bw(i,j);b = b + (j - xmean) * (i - ymean) * bw(i,j);c = c + (i - ymean)A2 * bw(i,j);end;end;b = 2 * b;theta = atan(b/(a-c))/2;theta = theta*(180/pi); % 从幅度转换到角度5.找区域边界function [left, right, up, down] = bianjie(A)[m n] = size(A);left = -1;right = -1;up = -1;down = -1;for j=1:n,for i=1:m,if (A(i,j) ~= 0)left = j;break;end;end;if (left ~= -1) break;end;end;for j=n:-1:1,for i=1:m,if (A(i,j) ~= 0)right = j;break;end;end;if (right ~= -1) break; end;end;for i=1:m,for j=1:n,if (A(i,j) ~= 0)up = i;break;end;end;if (up ~= -1) break;end;end;for i=m:-1:1,for j=1:n,if (A(i,j) ~= 0)down = i;break;end;end;if (down ~= -1)break;end;end;6.求起始坐标function newcoord = checklimit(coord,maxval)newcoord = coord;if (newcoord<1)newcoord=1;end;if (newcoord>maxval)newcoord=maxval;end;7•模板匹配function [ccorr, mfit, RectCoord]mobanpipei(mult. frontalmodel,ly,wx,cx, cy, angle) frontalmodel=rgb2gray(frontalmodel);model_rot = imresize(frontalmodel,[ly wx],'bilinear'); % 调整模板大小model_rot = imrotate(model_rot,angle,'bilinear'); %旋转模板[l,r,u,d] = bianjie(model_rot); % 求边界坐标bwmodel_rot=imcrop(model_rot,[l u (r-l) (d-u)]); % 选择模板人脸区域[modx,mody] =center(bwmodel_rot); % 求质心[morig, norig] = size(bwmodel_rot);%产生一个覆盖了人脸模板的灰度图像mfit = zeros(size(mult));mfitbw = zeros(size(mult));[limy, limx] = size(mfit);%计算原图像中人脸模板的坐标startx = cx-modx;starty = cy-mody;endx = startx + norig-1;endy = starty + morig-1;startx = checklimit(startx,limx);starty = checklimit(starty,limy);endx = checklimit(endx,limx);endy = checklimit(endy,limy);for i=starty:endy,for j=startx:endx,mfit(i,j) = model_rot(i-starty+1,j-startx+1);end;end;ccorr = corr2(mfit,mult) % 计算相关度[l,r,u,d] = bianjie(bwmodel_rot);sx = startx+l;sy = starty+u;RectCoord = [sx sy (r-1) (d-u)]; % 产生矩形坐标8.主程序clear;[fname,pname]=uigetfile({'*・jpg';'* .bmp';'* ・tif';'* ・gif'},'Please choose a color picture・・・');%返回打开的图片名与图片路径名[u,v]=size(fname);y=fname(v); % 图片格式代表值switch ycase 0errordlg('You Should Load Image File First ・・・','Warning ・・・');case{'g';'G';'p';'P';'f';'F'}; % 图片格式若是JPG/jpg、BMP/bmp、TIF/tif 或者GIF/gif,才打开I=cat(2,pname,fname);Ori_Face=imread(l);subplot(2,3,1),imshow(Ori_Face);otherwiseerrordlg('You Should Load Image File First ・・・','Warning ・・・'); endR=Ori_Face(:,:,1);G=Ori_Face(:,:,2);B=Ori_Face(:,:,3);R1=im2double(R); % 将uint8 型转换成double型处理G1=im2double(G);B1=im2double(B);RGB=R1+G1+B1;m=[ 0・4144,0.3174]; % 均值n=[0・0031,-0・0004;-0・0004,0.0003]; % 方差row=size(Ori_Face,1); % 行像素数column=size(Ori_Face,2); % 列像素数for i=1:rowfor j=1:columnif RGB(i,j)==0rr(i,j)=0;gg(i,j)=0;elserr(i,j)=R1(i,j)/RGB(i,j);% rgb归一化gg(i,j)=G1(i,j)/RGB(i,j);x=[rr(i,j),gg(i,j)];p(i,j)=exp((-0・5)*(x-m)*inv(n)*(x-m)'); % 皮肤概率服从高斯分布endendendsubplot(2,3,2);imshow(p); % 显示皮肤灰度图像low_pass=1/9*ones(3);image_low=filter2(low_pass, p); % 低通滤波去噪声subplot(2,3,3);imshow(image」ow);%自适应阀值程序previousSkin2 = zeros(i,j);changelist =[];for threshold = 0・55:-0.1:0.05two_value = zeros(i,j);two_value(find(image_low>threshold)) = 1;change = sum(sum(two_value - previousSkin2));changelist = [changelist change];previousSkin2 = two_value;end[C, I] = min(changelist);optimalThreshold = (7-1)* 0.1two_value = zeros(i,j);two_value(find(image_low>optimalThreshold))= 1; %二值化subplot(2,3,4);imshow(two_value); % 显示二值图像我的照片人脸模板.jpg'); %读入人脸模板照片FaceCoord=[|;imsourcegray=rgb2gray(Ori_Face); % 将原照片转换为灰度图像[L,N]=bwlabel(two_value,8); % 标注二值图像中连接的部分丄为数据矩阵,N为颗粒的个数for i=1:N,[x,y]=find(bwlabel(two_value)==i); % 寻找矩阵中标号为i 的行和列的下标bwsegment = bwselect(two_value,y,x,8); % 选择出第i 个颗粒numholes = 1-bweuler(bwsegment,4); % 计算此区域的空洞数if (numholes >= 1) % 若此区域至少包含一个洞,则将其选出进行下一步运算RectCoord = -1;[m n] = size(bwsegment);[cx,cy]=center(bwsegment);%求此区域的质心bwnohole=bwfill(bwsegment,'holes'); % 将洞圭寸住(将灰度值赋为1)justface = uint8(double(bwnohole)・* double(imsourcegray));%只在原照片的灰度图像中保留该候选区域angle = orient(bwsegment,cx,cy); %求此区域的偏转角度bw = imrotate(bwsegment, angle, 'bilinear');bw = bwfill(bw,'holes');[l,r,u,d] =bianjie(bw);wx = (r - l +1); % 宽度ly = (d - u + 1); % 高度wratio = ly/wx % 高宽比if ((0 ・8v=wratio)&(wratiov=2))%如果目标区域的高度/宽度比例大于0・8且小于2.0,则将其选出进行下一步运算S=ly*wx; %计算包含此区域矩形的面积A=bwarea(bwsegment); %计算此区域面积if (A/S>0.35)[ccorr,mfit, RectCoord] =mobanpipei(justface,frontalmodel,ly,wx, cx,cy, angle);end if (ccorr>=0.6)mfitbw=(mfit>=1);invbw = xor(mfitbw,ones(size(mfitbw)));source_with_hole = uint8(double(invbw) double(imsourcegray));final_image = uint8(double(source_with_hole) double(mfit));subplot(2,3,5);imshow(final_image); % 显示覆盖了模板脸的灰度图像imsourcegray = final_image;subplot(2,3,6);imshow(Ori_Face); % 显示检测效果图end;if (RectCoord ~= -1)FaceCoord = [FaceCoord; RectCoord];endendendend%在认为是人脸的区域画矩形[numfaces x] = size(FaceCoord);for i=1:numfaces,hd = rectangle('Position',FaceCoord(i,:));set(hd, 'edgecolor', 'y');end人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于肤色分割和匹配的人脸识别1.将RGB空间转换为YCbCr空间:为了把人脸区域从非人脸区域分割出来,需要使用适合不同肤色和不同光照条件的可靠的肤色模型。
常用的RGB 表示方法不适合于皮肤模型,在RGB 空间,三基色(r、g、b)不仅代表颜色,还表示了亮度。
由于周围环境光照的改变,亮度可能使人脸的检测变得更加复杂,在皮肤的分割过程中是不可靠的。
为利用肤色在色度空间的聚类性,需要把颜色表达式中的色度信息与亮度信息分开,将R、G、B 转换为色度与亮度分开的色彩表达空间可以达到这个目的。
颜色空间的转换常用的颜色模型主要有:YCrCb、HSV、YIQ等。
在本文的实验中选用YCrCb 空间作为肤色分布统计的映射空间,该空间的优点是受亮度变化的影响较小,而且是两维独立分布,能较好地限制肤色分布区域。
使用函数为:YCBCR = rgb2ycbcr(RGB);2.将彩色图像转换为灰度图像,实验证明,不同的肤色具有相同的2D模型G(m,V^2)。
灰度值对应属于皮肤区域的可能性,同过设定门限,就可以转换为二值图像,1,0分别表示皮肤和非皮肤区域。
皮肤颜色在ycbcr色度空间的分布范围为:100<=cb<=127,138<=cr<=170,可以将彩色图像转换为二值图像:f_cb=f(:,:,2);f_cr=f(:,:,3);f = (f_cb>=100) & (f_cb<=127) & (f_cr>=138) &(f_cr<=170) ;figure; imshow(f);3.转换后不可避免出现了噪声,有背景的噪声影响,以及人的衣服和裤子引起的噪声点,使用开闭运算的方法消除噪声:se=strel('square',3);f=imopen(f,se);f=imclose(f,se);figure(2),imshow(f);4.对图像做填孔处理f=imfill(f,'holes');figure(3),imshow(f);5.对图像进行重构,即利用重构进行开运算,可准确恢复腐蚀后的对象形状. fe=imerode(f,ones(8,7));fo=imopen(f,ones(8,7));f=imreconstruct(fe,f);figure(4),imshow(f);6.相关匹配,实际作用效果不大,可以注释掉. %w=ones(3);%f=imfilter(f,w);%figure(5),imshow(f);% [M,N]=size(f);% f=fft2(f);% w=conj(fft2(w,M,N));% g=real(ifft2(w.*f));% gs=gscale(g);% figure,imshow(gs);7.人脸候选区筛选时,由于头部部分重合,以及头部与其他部分,例如衣服等的连接,对筛选造成了困难,故应先利用闭运算操作,断开连接,再进行处理.se1=strel('square',8);f=imerode(f,se1);f=imdilate(f,se1);figure(6),imshow(f);8. 利用人脸候选区筛选,进一步确定人脸区域(判断规则如下):(1)若目标高宽比小于0.8而大于 2.0,则认为不是人脸区域,删除此区域。
(2)区域面积过大或过小,认为不是人脸区,删除此区域。
矩形面积area_sq =目标区长度*宽度,目标区面积为area,若area / area_sq <0.6,则认为不是人脸区域。
其中条件1限定了要检测的人脸区域的比例大小,排除了一些颜色类似皮肤但长宽不符合要求的区域。
(如颜色与皮肤接近的衣物)条件2排除一些不规则但色调和皮肤接近的物体,同时也可排除人体其他的非脸部区域,如四肢等。
[L,num]=bwlabeln(f,4);for i=1:num;[r,c]=find(L==i);r_temp=max(r)-min(r);c_temp=max(c)-min(c);temp=size(r);sum=sum+temp(1);area_sq=r_temp*c_temp;area=size(find(L==i),1);ratio=area/area_sq;if(r_temp/c_temp<0.8)|(r_temp/c_temp>2)|temp(1)>2000|temp(1)<200|ratio<0.6%脸部区域<200的去掉,一般为手或其他干扰.%利用脸部宽长比的大概上下限来确定一个模板范围.%矩形面积s=目标区长度*宽度,目标区面积为ss,若ss/s<0.6,认为不是%人脸区,删除之. for j=1:temp(1);L(r(j),c(j))=0;endelsecontinue;endend9. 利用边缘检测,检测出人脸;利用得到的边缘,对原图像进行处理,就可以在原图中画出人脸区域的框图.可以看出,由于人手交叉放置,所以不管从肤色还是形状以及面积比上,都很难将其识别和删除,所以出现了两个错误检测,这也是本程序应改进的地方.L=bwperim(L,8); %边缘检测,检测出人脸的边缘区域L=uint8(L);z=find(L(:)>0);L(z)=255;% ave=sum/num;%ave=696.figure(7),imshow(L);L_r=L;L_g=L;L_b=L;L_rgb=cat(3,L_r,L_g,L_b); %在原图上加框% figure,imshow(L_rgb);img1_r=min(L_r+img(:,:,1),255);img1_g=min(L_g+img(:,:,2),255);img1_b=min(L_b+img(:,:,3),255);img1=cat(3,img1_r,img1_g,img1_b);figure(8),imshow(img1);附录:完整程序清单:function facedetec()sum=0;% clc,close all;iptsetpref('ImshowBorder', 'tight')f=imread('faces.jpg');Ori_Face=f;copy=f;img=f;% figure,imshow(f);f=rgb2ycbcr(f);%rgb转换为ycbcr%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%% figure,imshow(f);f_cb=f(:,:,2);f_cr=f(:,:,3);f= (f_cb>=100) & (f_cb<=127) & (f_cr>=138) &(f_cr<=170) ;%皮肤颜色在ycbcr色度空间的分布范围为:100<=cb<=127,138<=cr<=170figure(1); imshow(f);%K=medfilt2(f,[5 5]);%5×5中值滤波,去除噪声%figure,imshow(f);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%利用开闭运算的方法消除噪声se=strel('square',3);f=imopen(f,se);f=imclose(f,se);figure(2),imshow(f);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%填孔处理f=imfill(f,'holes');figure(3),imshow(f);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%重构法fe=imerode(f,ones(8,7));fo=imopen(f,ones(8,7));f=imreconstruct(fe,f);figure(4),imshow(f);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%相关匹配,作用不大,可注释掉%w=ones(3);%w为模板大小.%f=imfilter(f,w);%figure(5),imshow(f);% [M,N]=size(f);% f=fft2(f);% w=conj(fft2(w,M,N));% g=real(ifft2(w.*f));% gs=gscale(g);% figure,imshow(gs); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%人脸候选区筛选时,由于头部部分重合,以及头部与其他%部分,例如衣服等的连接,对筛选造成了困难,故应先利用%闭运算操作,断开连接,再进行处理.se1=strel('square',8);f=imerode(f,se1);f=imdilate(f,se1);figure(6),imshow(f); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%区域连通[L,num]=bwlabeln(f,4);for i=1:num;[r,c]=find(L==i);r_temp=max(r)-min(r);c_temp=max(c)-min(c);temp=size(r);sum=sum+temp(1);area_sq=r_temp*c_temp;area=size(find(L==i),1);ratio=area/area_sq;if(r_temp/c_temp<0.8)|(r_temp/c_temp>2)|temp(1)>2000|temp(1)<200|ratio<0.6%脸部区域<250的去掉,一般为手或其他干扰.%利用脸部宽长比的大概上下限来确定一个模板范围.%矩形面积area_sq=目标区长度*宽度,目标区面积为area,若area/area_sq<0.6,认为不是人脸区,删除之.for j=1:temp(1);L(r(j),c(j))=0;endelsecontinue;endendL=bwperim(L,8);%边缘检测,检测出人脸的边缘区域L=uint8(L);z=find(L(:)>0);L(z)=255;% ave=sum/num;%ave=696.figure(7),imshow(L);L_r=L;L_g=L;L_b=L;L_rgb=cat(3,L_r,L_g,L_b);%在原图上加框% figure,imshow(L_rgb);img1_r=min(L_r+img(:,:,1),255);img1_g=min(L_g+img(:,:,2),255);img1_b=min(L_b+img(:,:,3),255);img1=cat(3,img1_r,img1_g,img1_b);figure(8),imshow(img1);。