创新性实验研究报告实验项目名称_matlab人脸识别_一、实验摘要本实验主要利用高斯肤色的归一化概率模型,将静态图像中的每一个像素限定在0到1的范围内。利用人工阈值法将肤色与非肤色区域分开,形成二值图像。对上述图像进行开闭运算,腐蚀膨胀等操作,弱化细节。通过脸部几何特征选取脸部区域,排除非脸部区域。后利用脸部区域最大最小行列坐标得到最小外接矩形。进一步分析可得两眼,嘴部坐标,以3点为基础画椭圆。最终圈定脸部区域。二、实验目的在一幅静态图片中找到人的脸部区域。三、实验场地及仪器、设备和材料:实验场地:J11-428实验室;仪器:PC机一台;材料:Matlab软件、待检测图片四、实验内容1、实验原理高斯肤色概率模型:由于统计表明不同人种的肤色区别主要受亮度信息影响,而受色度信息的影响较小,所以直接考虑YCbCr空间的CbCr分量,映射为CbCr空间,在CbCr空间下,受亮度变化的影响少,且是两维独立分布。通过实践,选取大量肤色样本进行统计,发现肤色在CbCr空间的分布呈现良好的聚类特性。统计分布满足:77Cb127并且满足:133Cr173根据肤色在色度空间的高斯分布,对根据肤色在色度空间的高斯分布,对于彩色图像中每个像素,将其从RGB色彩空间转换到YCbCr空间后,就可以计算该点属于皮肤区域的概率,即根据该点离高斯分布中心的远近得到和肤色的相似度,将彩色图像转化为灰度图,其中每个像素的灰度对应该点与肤色的相似度,相似度的计算公式如下:)]()(5.0exp[)(1mxCmxCbCrpT其中m为均值,m=E(x),C为协方差矩阵,TCbCrx)(,))({(TmxmxEC肤色分布的2D高斯模型G(m,V2)也可表示为),(CrCbmKiiCrNCr11NiiCbNCb11CrCrCrCbCbCrCbCbV其中,CrCb、为CrCb、相应的平均值,V为协方差矩阵。为了利用肤色在色度空间的聚类性,选取YCbCr色彩空间进行肤色提取。首先将彩色图片颜色空间转换到YcbCr空间,然后对该区域的CbCr值进行统计处理。处理的方法就是采用高斯模型。m=E(x),TCbCrx)(,C为协方差矩阵,{()()}TCExmxm。通过这个肤色高斯分布可得到待检测彩色图像中任意一个像素点属于皮肤的概率。对于某像素点s,从RGB空间转换到YCbCr色彩空间得到色度值(Cb,Cr)则该像素的肤色概率密度可由下式计算得到:)]()(5.0exp[)(1mxCmxCbCrpT式中:TCbCrx)(。通过计算,得到m和C的值如下:m=[117.4316148.5599];9966.1414700.244700.240946.97C(1)YCbCr色彩空间是数字视频常用的色彩模型。在模型中,亮度信息单独储存在Y中,色度信息储存在Cb和Cr中。Cb和Cr分别表示蓝色分量和红色分量相对的参考值。Matlab中实现YCbCr色彩空间的转换函数为rgb2ycbcr。YCbCr色彩空间是人脸检测非常好的选择。因为其受亮度变化的影响小,能较好地限制肤色分布区域,而且在YCbCr色彩空间中肤色聚类特性比较好。因此我们采用构建YCbCr色彩空间的肤色模型来得出肤色概率谱,计算出每一个像素与肤色的相似度,并将每一点的灰度值与其为肤色的概率关联起来,得到肤色似然图。越靠近肤色灰度值越高,无关部分灰度值会较低。(2)阈值化是人脸检测中非常重要的一步。上一步操作得到肤色似然图后,由于近似肤色部分灰度值比较高,无关部分灰度值比较低,因此,选定合适的阈值后进行阈值分割,得到的二值图像可以有效地将近似肤色区域和无关部分分割开,无关部分将作为黑色背景色。便于下一步的操作。经过测试,阈值在0.5-0.6都能满足实验要求。(3)因为要考虑到原图像的多样与复杂性,非肤色区域中依然有可能有部分区域颜色与肤色相近,所以阈值分割后的图像依然存有部分假肤色区域,经过开闭操作、填洞操作、腐蚀膨胀操作可以有效地去掉毛刺、假肤色区域等,从而得到一个较为纯净的肤色区域。(4)得到的肤色区域可能含有较多的人体信息,包括人脸、手臂、手掌、腿部等等。由于实验目标是人脸检测,所以需要做面部特征定位把人脸和其他肤色区域区分开来。因为待检测图片中的人物信息都是着装的,所以人脸或者人脸包括颈部和身体的其他部分区域可以被衣服隔开,一般都是非联通的。因此本次实验使用的方法为对每个区域进行扫描,通过限制长宽比、区域的像素个数(等同于限制区域大小)和矩形度可以有效地将人脸部分从肤色区域中筛选出来,非人脸区域可以全赋值为0融入背景色。同时得到结果与阈值化图像相与,得到眼嘴特征。(若有)(5)最终得到的区域即为人脸区域,对其扫描后可以得到其长宽的最大最小值坐标,从而可以轻易画出此区域的最小外接矩形,在原待测图片上按照相同坐标画出矩形后,矩形框内即为人脸;而对有眼嘴特征的图像,则扫描定位眼睛和嘴巴的位置,用“*”号标注,以这三点为基准画出更贴近人脸的椭圆。这两种方法都能达到返回人脸位置大小的目的。2、实验内容实例一:(1)通过肤色概率模型得到源图像概率图:(2)人工阈值得二值化图像:(3)选定脸部区域:(4)将2,3所得图像做and运算:FaceRegion(5)通过眼嘴确定人脸区域:实例二:通过肤色概率模型得到源图像概率图:(2)人工阈值得二值化图像:(3)选定脸部区域:(4)将2,3所得图像做and运算:SetthresholdFaceandFeaturesSetthresholdFaceRegion(5)通过脸部区域坐标确定人脸区域:TestFaceRec-ed3、实验步骤根据课题要求,查阅相关书籍;根据课题条件,设计算法流程;算法步骤如下:寻找合适的肤色概率模型。对概率模型进行阈值选择。形成二值化图像将上述的二值化图像进行几何辨识,筛选出脸部区域。对脸部区域特征扫描,找到眼,嘴坐标,若未扫描到眼,跳至(6)。对所得3点坐标为基准画椭圆,确定出脸部区域。将(3)得到的脸部区域图加上最小外界矩形,可粗略确定出脸部区域。在matlab环境中运行根据算法编写的程序;测试程序;调试;进一步优化算法,优化程序。FaceandFeatures五、实验结果与分析1、实验现象、数据记录本次人脸检测实验采用了2种圈定人脸的方法(椭圆和最小外接矩形),如果静态图片人脸检测成功,将显示类似如下结果:(其中最小外接矩形在扫描不出人眼时作为备用圈定人脸的方案)图1椭圆圈定人脸图2矩形圈定人脸另外,程序中还有在图片中定位眼嘴的语句,以方便程序后期调试,现象类似如下:图3人脸特征标记2、对实验现象、数据及观察结果的分析与讨论:本次实验程序对正面人脸的检测率基本能满足快速检测出图片中人脸的需要,检测率也比较让人满意。实现方法简便有效,如果能进一步增加滤波、光照补偿等步骤,将可以在满足实验要求的前提下进一步提高检测率和检测精度。TestFaceRec-ed3、关键点:本次实验实现人脸检测的方法为利用人脸的明显特征,肤色,过程是把人脸图像视为一个高维向量,从而将人脸检测问题转化为高维空间中分布信号的检测问题,这个转化的数学形态学思想实现起来较为简便,不仅省去了训练的过程,而且对人脸的表情、脸部细节容差也比较大,在符合本次实验目的的前提下选用这种方法是很适合的,而这种方法所带来的肤色模型、肤色采集、阈值分割等问题,也成为了这次创新性实验的关键。六、实验结论这次基于肤色的人脸检测肤色分割方法本身就是一种较为基础的基于特征的静态人脸检测方法,如果要求更高,还需要更高级的算法,因为要考虑到待测图片的多样性和复杂性,由于人的姿态、人种肤色、光照、噪声等等都有可能影响到图片质量或者图片色度,这个人脸检测程序还需要进一步的完善才能满足更高的要求。七、指导老师评语及得分:签名:年月日附件:源程序等。clc;clearall;closeall;x=imread('f.jpg');y=rgb2ycbcr(x);[abc]=size(y);cb=double(y(:,:,2));cr=double(y(:,:,3));fori=1:a;forj=1:bw=[cb(i,j)cr(i,j)];m=[117.4316148.5599];n=[260.130112.1430;12.1430150.4574];p(i,j)=exp((-0.5)*(w-m)*inv(n)*(w-m)');endendz=p./max(max(p));%---------------------------------------------------------complextionprobabilityimshow(z)%figure;imshow(x);th=0.5;fori=1:aforj=1:bif(z(i,j)th)z(i,j)=1;elsez(i,j)=0;endendendfigure;imshow(z);title('Setthreshold')%-----------------------------------thresholdse=strel('square',3);f=imopen(z,se);f=imclose(f,se);%figure,imshow(f);%openandcloseprocessing;f=imfill(f,'holes');%figure,imshow(f);%fillholesintheImgse1=strel('square',8);f=imerode(f,se1);f=imdilate(f,se1);%figure,imshow(f);%----------------------------------------------------erosionandexpansion;[L,num]=bwlabel(f,4);fori=1:num;%regionloop;[r,c]=find(L==i);len=max(r)-min(r)+1;wid=max(c)-min(c)+1;area_sq=len*wid;area=size(r,1);forj=1:size(r,1)%pixelloop;if(len/wid.8)|(len/wid2.4)|size(r,1)200|area/area_sq0.55L(r(j),c(j))=0;%notzeropixel=0;elsecontinue;endendendfigure;imshow(L);title('FaceRegion')%---------------------------------eliminateNOTfacerengion;w=L&z;figure;imshow(w);title('FaceandFeatures')%---------------------------recoverthefeaturesofface[rc]=find(L~=0);r_min=min(r);r_max=max(r);c_min=min(c);c_max=max(c);figure;imshow(x);holdon%plot(round(.5*(c_max+c_min)),round(.5*(r_max+r_min)),'+')flg=0;fori=round(.5*(r_min+r_max)):-1:round(1/3*(r_max-r_min)+r_min)forj=round(.5*(c_max+c_min)):-1:round(1/3*(c_max-c_min)+c_min)if(w(i,round(j))==0)flg=1;break;endendif(flg==1),break,endendw(i,j)if(w(i,j)==0)e1_x=j;e1_y=i;%plot(j,i,'*')%-------------------------------------