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人脸检测是人脸识别、人机交互、智能视觉监控等工作的前提。
肤色分割人脸检测matlab代码
image = imread('im.jpg');figure,imshow(image);red = double(image(:,:,1));green = double(image(:,:,2));blue = double(image(:,:,3));[m n]=size(red);Y = zeros(m,n);Cb = zeros(m,n);Cr = zeros(m,n);I = zeros(m,n);Q = zeros(m,n);red_gama = zeros(m,n);green_gama = zeros(m,n);blue_gama = zeros(m,n);for i=1:m %gamma矫正for j=1:nif red(i,j)>0 && red(i,j)<90fai=pi*red(i,j)/180;gama=1+0.5*cos(fai);red_gama(i,j)=255*(red(i,j)/255)^(1/gama);elseif red(i,j)>=90 && red(i,j)<=170fai=pi/2;gama=1+0.5*cos(fai);red_gama(i,j)=255*(red(i,j)/255)^(1/gama);elseif red(i,j)>170 && red(i,j)<=255fai=pi-pi*(255-red(i,j))/170;gama=1+0.5*cos(fai);red_gama(i,j)=255*(red(i,j)/255)^(1/gama);endif green(i,j)>0 && green(i,j)<90fai=pi*green(i,j)/180;gama=1+0.5*cos(fai);green_gama(i,j)=255*(green(i,j)/255)^(1/gama);elseif green(i,j)>=90 && green(i,j)<=170fai=pi/2;gama=1+0.5*cos(fai);green_gama(i,j)=255*(green(i,j)/255)^(1/gama);elseif green(i,j)>170 && green(i,j)<=255fai=pi-pi*(255-green(i,j))/170;gama=1+0.5*cos(fai);green_gama(i,j)=255*(green(i,j)/255)^(1/gama);endif blue(i,j)>0 && blue(i,j)<90fai=pi*blue(i,j)/180;gama=1+0.5*cos(fai);blue_gama(i,j)=255*(blue(i,j)/255)^(1/gama);elseif blue(i,j)>=90 && blue(i,j)<=170fai=pi/2;gama=1+0.5*cos(fai);blue_gama(i,j)=255*(blue(i,j)/255)^(1/gama);elseif blue(i,j)>170 && blue(i,j)<=255fai=pi-pi*(255-blue(i,j))/170;gama=1+0.5*cos(fai);blue_gama(i,j)=255*(blue(i,j)/255)^(1/gama);endendendfor i=1:mfor j=1:nY(i,j)=0.2989*red_gama(i,j)+0.5866*green_gama(i,j)+0.1145*blue_gama(i,j) ;Cb(i,j)=-0.1688*red_gama(i,j)-0.3312*green_gama(i,j)+0.5000*blue_gama(iCr(i,j)=0.5000*red_gama(i,j)-0.4184*green_gama(i,j)-0.0817*blue_gama(i,j) ;endendemp=zeros(m,n);sita=zeros(m,n);for i=1:mfor j=1:nif Cr(i,j)>0 && Cb(i,j)>0sita(i,j)=atan(abs(Cr(i,j))/abs(Cb(i,j)))*180/pi;elseif Cr(i,j)>0 && Cb(i,j)<0sita(i,j)=180-atan(abs(Cr(i,j))/abs(Cb(i,j)))*180/pi;elseif Cr(i,j)<0 && Cb(i,j)<0sita(i,j)=180 + atan(abs(Cr(i,j))/abs(Cb(i,j)))*180/pi;elsesita(i,j)=0;endendendfor i=1:mfor j=1:nif sita(i,j)>105 && sita(i,j)<150emp(i,j)=sita(i,j);elseemp(i,j)=0;Y(i,j)=0;endendfigure,imshow(emp); figure,imshow(uint8(Y));原图像分割结果分割结果。
基于肤色信息的人脸检测MATLAB程序
clear allclose allclc%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 读入待检测图像x=imread('C:\Documents and Settings\Administrator.30178A3145BA4BF\桌面\2.jpg'); %读入图像figureimshow(x)if size(x,3)>1x=rgb2gray(x);%转化为灰度图endx=double(x); %转化为小数型[output,count,m,svec]=facefind(x);%找出人脸,output返回人脸位置和大小信息,count为人脸个数信息,m实际检测到的最大人脸和最小人脸信息imagesc(x)colormap(gray) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 画出人脸框图col=[1 0 0];%人脸框图为红色col=[0 1 0];%人脸框图为绿色t=2; %人脸框图线的宽度N=size(output,2);if (N>0)for i=1:Nx1=output(1,i);x2=output(2,i);y1=output(3,i);y2=output(4,i);vec=[x1 x2 y1 y2]; %方框四个角的坐标ind=find(isinf(vec)); %无限值情况a=200; %should be realmaxvec(ind)=sign(vec(ind))*a;h1=line([vec(1) vec(2)],[vec(3) vec(3)]);h2=line([vec(2) vec(2)],[vec(3) vec(4)]);h3=line([vec(1) vec(2)],[vec(4) vec(4)]);h4=line([vec(1) vec(1)],[vec(3) vec(4)]);h=[h1 h2 h3 h4];set(h,'Color',col);set(h,'LineWidth',t)endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% minf=m(1);maxf=m(2);ex1=size(x,1)*0.01;ex1e=size(x,1)*0.02;ex2=size(x,1)*0.04;ex2e=size(x,1)*0.05;bx1=[0 maxf maxf 0];by1=[ex1e ex1e ex1 ex1];bx2=[0 minf minf 0];by2=[ex2e ex2e ex2 ex2];hold onfill(bx1,by1,[0 1 0])fill(bx2,by2,[0 1 0])hold off。
(完整版)基于matlab程序实现人脸识别
基于matlab程序实现人脸识别1.人脸识别流程1.1.1基本原理基于YCbCr颜色空间的肤色模型进行肤色分割。
在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。
采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。
1.1.2流程图人脸识别流程图读入原始图像将图像转化为YCbCr颜色空间利用肤色模型二值化图像并作形态学处理选取出二值图像中的白色区域,度量区域属性,筛选后得到所有矩形块否筛选特定区域(高度和宽度的比率在(0.6~2)之间,眼睛特征)是存储人脸的矩形区域特殊区域根据其他信息筛选,标记最终的人脸区域2.人脸识别程序(1)人脸和非人脸区域分割程序function result = skin(Y,Cb,Cr)%SKIN Summary of this function goes here% Detailed explanation goes herea=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;否则为肤色,返回1if value>1result=0;elseresult=1;endend(2)人脸的确认程序function eye = findeye(bImage,x,y,w,h)%FINDEYE Summary of this function goes here % Detailed explanation goes herepart=zeros(h,w);%二值化for i=y:(y+h)for j=x:(x+w)if bImage(i,j)==0part(i-y+1,j-x+1)=255;elsepart(i-y+1,j-x+1)=0;endendend[L,num]=bwlabel(part,8);%如果区域中有两个以上的矩形则认为有眼睛if num<2eye=0;elseeye=1;endend(3)人脸识别主程序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:widthY=ycbcr(i,j,1);Cb=ycbcr(i,j,2);Cr=ycbcr(i,j,3);if(Y<80)gray(i,j)=0;elseif(skin(Y,Cb,Cr)==1)%根据色彩模型进行图像二值化gray(i,j)=255;elsegray(i,j)=0;endendendendse=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);%矩形坐标Xy=box(2);%矩形坐标Yw=box(3);%矩形宽度wh=box(4);%矩形高度hratio=h/w;%宽度和高度的比例ux=uint16(x);uy=uint8(y);if ux>1ux=ux-1;endif uy>1uy=uy-1;endif w<20 || h<20|| w*h<400 %矩形长宽的范围和矩形的面积可自行设定continueelseif ratio<2 && ratio>0.6 && findeye(gray,ux,uy,w,h)==1%根据“三庭五眼”规则高度和宽度比例应该在(0.6,2)内;result(n,:)=[ux uy w h];n=n+1;endendif 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);m4=result(m,4);%得到符合和人脸匹配的数据if m1+m3<width && m2+m4<heighth && m3<0.2*widtha=a+1;arr1(a)=m3;arr2(a)=m4;%rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endend%得到人脸长度和宽度的最小区域arr3=[];arr3=sort(arr1,'ascend');arr4=[];arr4=sort(arr2,'ascend');%根据得到的数据标定最终的人脸区域for m=1:size(result,1)m1=result(m,1);m2=result(m,2);m3=result(m,3);m4=result(m,4);%最终标定人脸if m1+m3<width && m2+m4<heighth && m3<0.2*widthm3=arr3(1);m4=arr4(1);rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endendend(4)程序说明人脸识别程序主要包含三个程序模块,人脸识别主程序由三部分构成。
MATLAB技术人脸识别算法
MATLAB技术人脸识别算法MATLAB技术在人脸识别算法中的应用人脸识别技术是近年来快速发展的一项先进技术,它可以实现对人脸图像进行自动识别和身份验证。
作为一种非接触式的生物识别技术,人脸识别具有高效、方便、准确的特点,因此在安全领域、人机交互、图像检索等方面有着广泛的应用。
而MATLAB作为一种功能强大的科学计算工具,其丰富的图像处理工具箱和灵活的编程环境,使得其成为人脸识别算法研究和开发的重要工具。
一、人脸识别算法概述人脸识别算法主要包括人脸检测、人脸特征提取和人脸匹配三个步骤。
人脸检测是指从图像或视频中自动检测并定位人脸,通常采用基于特征的方法(如Haar特征、HOG特征等)或基于模型的方法(如支持向量机、神经网络等)进行。
人脸特征提取是指从检测到的人脸中提取出具有代表性的特征,常用的方法有主成分分析(PCA)、线性判别分析(LDA)、局部二值模式(LBP)等。
人脸匹配是指将提取出来的人脸特征与已有的数据库中的人脸特征进行比对和匹配,一般采用欧氏距离、余弦相似度等度量方法。
二、MATLAB中的人脸检测算法实现MATLAB提供了多种人脸检测算法的库函数和工具箱,例如Viola-Jones算法、DLib算法等。
这些算法基于不同的原理和方法,可以根据实际需求选择适合的算法进行人脸检测。
以Viola-Jones算法为例,其基于Haar特征的方法可以高效地进行人脸检测。
在MATLAB中,可以使用“vision.CascadeObjectDetector”类实现Viola-Jones算法的人脸检测功能。
首先,需要加载人脸检测器对象,并使用“detect”方法对图像进行人脸检测,最后使用“insertShape”方法将检测结果标记在原图像上。
三、MATLAB中的人脸特征提取算法实现MATLAB提供了多种常用的人脸特征提取算法的函数和工具箱,如PCA、LDA、LBP等。
这些算法能够对从图像中提取到的人脸特征进行降维和优化,以便于后续的人脸匹配工作。
基于MATLAB的人脸识别与分割
( 2 ) 熟 练 掌握 基 于 M A T L A B对数 字图像读入 , 预 处理 的
方 法 及 图 像 分 割 技 术
( 3 ) 提 高 自我 通过 查 阅 资料 , 筛选 有 用信 息 的 能 力 。
2 设 计过程
2 . 1将 R G B图像 转化 到 Y C b C r 空 间
睛, 和 鼻 子 的位 置 坐标 保 存 起 来 。再 将 图像 二 值 化 , 分别只留
引 言
图像 可 以给 人 带 来 直观 的视 觉 感 触 ,是 人 们 感 受世 界 的 流 人 类 在 很 多情 况 下是 利 用 图像 来获 得 信 息 、 分析 判 断信 息 和传 递信 息 的 。今 天 , 图像 识 别 已经 在 金 融 、 航天、 科 学研 究 、 健康 医疗及 许 多企 事 业 单位 等 等 广 泛 的 领 域 都 有 着 越 来 越 多
Y C b C r 空 间 是 一 种较 为 常见 的 色彩 模 型 , 其 中 Y是 代 表 图像 的 明 亮度 ( L u m i n a n c e或 L u ma ) , 也被称 为灰阶值 , 图像 中
“ 亮度 ” 信 息 是 通 过 输 入 信 号 RGB 进 行 确 定 的 . 具 体 过 程 是 将
2 0
基 于 MA T L AB 的人 脸 识 别 与 分 割
杨振 洁 , 贾皓 强 , 赵 富康 ( 河北零业大学, 河北 保定 0 7 1 0 0 0 )
\
l
【 摘 要 】 本文 针对的是基于 M A T L A B函数 的人脸识别技术及人脸五 官分割技术。 人脸 的肤色信息在彩图中是一个较 为稳定的特征信息 , 这是
的 需 求 不 仅 人 工 智 能 的 飞 速 发 展 加 快 了 人 脸 识 别 技 术 的 快 速
在MATLAB中使用人脸识别算法的技巧
在MATLAB中使用人脸识别算法的技巧人脸识别是一种应用广泛的图像处理技术,它可以通过识别和比对人的面部特征,实现身份认证、人脸跟踪等功能。
MATLAB作为一种强大的科学计算软件,也提供了丰富的图像处理函数和工具箱,可以用于实现人脸识别算法。
本文通过介绍人脸识别算法的基本原理和MATLAB中的应用技巧,帮助读者更好地利用MATLAB进行人脸识别任务。
一、人脸识别算法的基本原理人脸识别算法的核心任务是从图像中提取人脸特征,并将其与数据库中的特征进行比对。
常见的人脸识别算法有Eigenface、Fisherface和LBPH等。
其中,Eigenface算法主要通过PCA(Principal Component Analysis)降维技术将高维的人脸图像转化为低维的特征向量,实现特征提取的目的;Fisherface算法则利用LDA (Linear Discriminant Analysis)方法将人脸样本映射到一个低维子空间,以实现类别判别和特征提取;LBPH(Local Binary Patterns Histograms)算法则是一种局部特征提取的方法,通过提取图像中人脸局部纹理特征来进行识别。
二、在MATLAB中实现人脸识别算法的准备工作在使用MATLAB进行人脸识别算法实现之前,需要准备一些必要的工作。
首先,需要使用MATLAB的`Image Processing Toolbox`工具箱,该工具箱提供了丰富的图像处理函数和工具,方便进行图像预处理和特征提取。
此外,还需要准备人脸图像数据库,用于训练和测试人脸识别算法。
三、图像预处理在进行人脸识别算法之前,需要对输入的图像进行预处理,以提高算法的准确性和鲁棒性。
常见的图像预处理操作包括人脸检测、图像裁剪和归一化等。
MATLAB的`vision.CascadeObjectDetector`对象可以用于进行人脸检测,通过调用其`step`方法,可以实现对图像中人脸的定位和检测。
基于某matlab程序实现人脸识别
基于matlab程序实现人脸识别1.人脸识别流程1.1.1基本原理基于YCbCr颜色空间的肤色模型进行肤色分割。
在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。
采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。
1.1.2流程图人脸识别流程图读入原始图像将图像转化为YCbCr颜色空间利用肤色模型二值化图像并作形态学处理选取出二值图像中的白色区域,度量区域属性,筛选后得到所有矩形块否筛选特定区域(高度和宽度的比率在(0.6~2)之间,眼睛特征)是存储人脸的矩形区域特殊区域根据其他信息筛选,标记最终的人脸区域2.人脸识别程序(1)人脸和非人脸区域分割程序function result = skin(Y,Cb,Cr)%SKIN Summary of this function goes here% Detailed explanation goes herea=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;否则为肤色,返回1if value>1result=0;elseresult=1;endend(2)人脸的确认程序function eye = findeye(bImage,x,y,w,h)%FINDEYE Summary of this function goes here % Detailed explanation goes herepart=zeros(h,w);%二值化for i=y:(y+h)for j=x:(x+w)if bImage(i,j)==0part(i-y+1,j-x+1)=255;elsepart(i-y+1,j-x+1)=0;endendend[L,num]=bwlabel(part,8);%如果区域中有两个以上的矩形则认为有眼睛if num<2eye=0;elseeye=1;endend(3)人脸识别主程序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:widthY=ycbcr(i,j,1);Cb=ycbcr(i,j,2);Cr=ycbcr(i,j,3);if(Y<80)gray(i,j)=0;elseif(skin(Y,Cb,Cr)==1)%根据色彩模型进行图像二值化 gray(i,j)=255;elsegray(i,j)=0;endendendendse=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);%矩形坐标Xy=box(2);%矩形坐标Yw=box(3);%矩形宽度wh=box(4);%矩形高度hratio=h/w;%宽度和高度的比例ux=uint16(x);uy=uint8(y);if ux>1ux=ux-1;endif uy>1uy=uy-1;endif w<20 || h<20|| w*h<400 %矩形长宽的范围和矩形的面积可自行设定continueelseif ratio<2 && ratio>0.6 && findeye(gray,ux,uy,w,h)==1 %根据“三庭五眼”规则高度和宽度比例应该在(0.6,2)内;result(n,:)=[ux uy w h];n=n+1;endendif 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,则再根据其他信息进行筛选arr1=[];arr2=[];for m=1:size(result,1)m1=result(m,1);m2=result(m,2);m3=result(m,3);m4=result(m,4);%得到符合和人脸匹配的数据if m1+m3<width && m2+m4<heighth && m3<0.2*widtha=a+1;arr1(a)=m3;arr2(a)=m4;%rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endend%得到人脸长度和宽度的最小区域arr3=[];arr3=sort(arr1,'ascend');arr4=[];arr4=sort(arr2,'ascend');%根据得到的数据标定最终的人脸区域for m=1:size(result,1)m1=result(m,1);m2=result(m,2);m3=result(m,3);m4=result(m,4);%最终标定人脸if m1+m3<width && m2+m4<heighth && m3<0.2*widthm3=arr3(1);m4=arr4(1);rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endend(4)程序说明人脸识别程序主要包含三个程序模块,人脸识别主程序由三部分构成。
基于matlab程序实现人脸识别
For personal use only in study andresearch; not for commercial use基于matlab程序实现人脸识别1.人脸识别流程基于YCbCr颜色空间的肤色模型进行肤色分割。
在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显着不同。
采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。
人脸识别流程图2.人脸识别程序(1)人脸和非人脸区域分割程序function result = skin(Y,Cb,Cr)%SKIN Summary of this function goes here% Detailed explanation goes herea=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;否则为肤色,返回1if value>1result=0;elseresult=1;endend(2)人脸的确认程序function eye = findeye(bImage,x,y,w,h)%FINDEYE Summary of this function goes here % Detailed explanation goes herepart=zeros(h,w);%二值化for i=y:(y+h)for j=x:(x+w)if bImage(i,j)==0part(i-y+1,j-x+1)=255;elsepart(i-y+1,j-x+1)=0;endendend[L,num]=bwlabel(part,8);%如果区域中有两个以上的矩形则认为有眼睛if num<2eye=0;elseeye=1;endend(3)人脸识别主程序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:widthY=ycbcr(i,j,1);Cb=ycbcr(i,j,2);Cr=ycbcr(i,j,3);if(Y<80)gray(i,j)=0;elseif(skin(Y,Cb,Cr)==1)%根据色彩模型进行图像二值化gray(i,j)=255;elsegray(i,j)=0;endendendendse=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);%矩形坐标Xy=box(2);%矩形坐标Yw=box(3);%矩形宽度wh=box(4);%矩形高度hratio=h/w;%宽度和高度的比例ux=uint16(x);uy=uint8(y);if ux>1ux=ux-1;endif uy>1uy=uy-1;endif w<20 || h<20|| w*h<400 %矩形长宽的范围和矩形的面积可自行设定continueelseif ratio<2 && ratio>0.6 && findeye(gray,ux,uy,w,h)==1%根据“三庭五眼”规则高度和宽度比例应该在(0.6,2)内;result(n,:)=[ux uy w h];n=n+1;endendif 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);m4=result(m,4);%得到符合和人脸匹配的数据if m1+m3<width && m2+m4<heighth && m3<0.2*width a=a+1;arr1(a)=m3;arr2(a)=m4;%rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endend%得到人脸长度和宽度的最小区域arr3=[];arr3=sort(arr1,'ascend');arr4=[];arr4=sort(arr2,'ascend');%根据得到的数据标定最终的人脸区域for m=1:size(result,1)m1=result(m,1);m2=result(m,2);m3=result(m,3);m4=result(m,4);%最终标定人脸if m1+m3<width && m2+m4<heighth && m3<0.2*widthm3=arr3(1);m4=arr4(1);rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endendend(4)程序说明人脸识别程序主要包含三个程序模块,人脸识别主程序由三部分构成。
Matlab人脸检測方法(FacePartsDetection)具体解释
Matlab⼈脸检測⽅法(FacePartsDetection)具体解释 今天同学让我帮忙制作⼀个⼈脸表情识别的样本库,当中主要是对⼈脸进⾏裁剪,这⾥⽤到了⼀个相对较新的Matlab⼈脸检測⽅法Face Parts Detection。
⽹上百度了⼀下发现关于Matlab⼈脸检測的代码和资源并不多。
故此专门撰写⼀篇博客来具体介绍这个⼈脸检測⽅法的⽤途。
⼀、下载相应的⼯具包 ⾸先下载相应的⼯具包。
matlab最⽅便的地⽅莫过于此了。
直接下载、配置简单、⽽且能够查看源代码,这⾥给出相应的⼯具包下载地址:。
点击“Download Zip”下载button開始下载,下载完毕后解压,得到例如以下⽂件: ⼆、配置⼯具包 下载完毕后開始配置⼯具箱。
⾸先须要强调⼀点,这种⽅法须要依赖两个Matlab图像处理⽅⾯的⼯具箱和。
差点⼉全部版本号的Matlab都默认集成了Image Processing⼯具箱。
但对于Computer Vision System⼯具箱仅仅有相对较⾼版本号(Matlab2013及以上)的Matlab版本号才进⾏了集成,因此假设在程序运⾏过程中提⽰缺少相应的⼯具箱,则须要⼿动进⾏配置Computer Vision System。
假设Matlab已经配置好了以上两个⼯具箱,接下来開始配置Face Parts Detection⼯具包,⽅法极其简单,仅仅需在Set Path对话框中将当前⼯具箱的⽬录(这⾥是Face_detection_Parts⽬录)路径加⼊到系统的搜索路径就可以: 三、进⾏批量⼈脸检測 ⼯具箱配置完毕后開始利⽤其进⾏⼈脸检測。
3.1、批量读取图⽚ ⾸先,须要对数据库中的图像进⾏批量读取,读取完之后再进⾏⼈脸检測。
⾸先给出批量读取的代码。
稍后解释:clear;stImageFilePath = 'E:\CAS-PEAL-R1(1)\CAS-PEAL-R1\FRONTAL\Expression\';stImageSavePath = 'E:\Face_Detection\';dirImagePathList = dir(strcat(stImageFilePath,'*.tif')); %读取该⽬录下全部图⽚的路径(字符串格式)iImageNum = length(dirImagePathList); %获取图⽚的总数量if iImageNum > 0 %批量读⼊图⽚,进⾏五官检測,再批量检測for i = 1 : iImageNumiSaveNum = int2str(i);stImagePath = dirImagePathList(i).name;mImageCurrent = imread(strcat(stImageFilePath,stImagePath));endend 这⾥採⽤dir()函数的⽅法来读取⽬录下全部⽂件的⽂件名称,dirImagePathList(i).name中保存了⽬录下的全部⽂件的名称。
- 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);。