多读书,多做事,广交朋友,趣味丛生
分类:IT业界
2010-04-2420:26:21
目录
摘要
本文对基于人脸识别的图片检索系统进行了研究和实现,通过给定的BMP文件图片找到文件夹中与该图片中的人脸相似的图片。包括了人脸检测和图片检索两个过程。人脸区域的检测采用基于特征的方法。首先进行二值处理,运用开闭运算消除衣服噪声对图像产生的影响,再进行填孔处理,筛选人脸候选区,使用边缘检测画出人脸区域,由此实现了确定图片中人脸区域位置的功能。检索图片前,进行特征提取,采用基于统计的特征脸方法。检索过程通过计算欧式距离实现。特征提取过程中,对图片库进行处理,提取特征脸向量后,生成特征库。然后计算预处理后的待检索图片与特征库的欧式距离,由小到大排序,选择前三的图片,再看欧式距离是否在一个范围内,如果是的话就继续输出在此范围内的图片。由此实现了检索出含有相似人脸图片的功能。实验结果表明,该算法适合灰度图片的检索。软件在MATLAB环境中设计与实现。
关键词:人脸检测,图片检索,数字图像处理
ABSTRACT
KEYWORDS:facedetection,picturesearching,imageprocessing
第一章绪论
本课题的模块图如图1.1所示:
图1.1设计模块图做所有工作前首先要采集大量图片作为图片数据库,并且用画图工具将JPG格式的图片转化为BMP格式。第二章,BMP文件的读取与显示。介绍了BMP格式文件的结构,软件的读取与显示的实现。第三章,人脸检测与特征提取的方法与软件实现。人脸检测是人脸识别的一个重要步骤,准确地检测出人脸区域才能使得后面的特征提取顺利进行。特征提取为图片检索打好基础,图片数据库的训练就是库中图片人脸特征的提取,以便之后的特征比对。第四章,图片检索的方法与软件实现。这部分的重点是欧式距离的计算,运用第三章中提取的图片的特征向量与经过K-L变换的需要检索的图片的特征向量进行欧式距离的计算,再把所得结果进行排序,输出相似度前三位的图片。第五章,总结。对本论文的提出的一些理论观点作出总结,并对实现过程中出现的问题作出分析与解决。
第二章BMP文件的读取与显示
2.2BMP文件的读取与显示2.2.1BMP文件的读取读取图片信息之前要选择需要检索的图片,用函数[file_namefile_path]=uigetfile(‘*.bmp’)实现。文件名和文件路径分别由参数file_name和file_path返回。打开文件对话框如图2.2所示:
从workspace中我们可以看到file_name为‘04.bmp’,file_path为‘D:\MatLab7\新建文件夹\work\实验素材\’。MATLAB中从图像文件中读取数据用函数imread(),这个函数的作用就是将图像文件的数据读入矩阵中,此外还可以用imfinfo()函数查看图像文件的信息。读取图像信息:[A,M]=imread([file_path,file??_name]),将图像数据放入矩阵A中,颜色数据放入矩阵M中。如要简单改变图像颜色,可以改变M矩阵的行列数据。由于我在程序中使用的是灰度图像,所以M矩阵为空。矩阵A就为192×128×3的大小。2.2.2BMP文件的显示MATLAB在窗口中显示图像用函数imshow(),使用该函数前必须先有读取数据函数imread(),将数据存储在矩阵中。如:x=imread(‘D:\MatLab7\新建文件夹\work\实验素材\04.bmp’);imshow(x);这两句语句就可以显示上述文件夹下的文件,如图2.3所示:
2.3本章小结本章所涉及的内容虽然不是本次设计的重要部分,但是对BMP文件的操作是所有内容的一个基础,读取图像的数据,存储在矩阵中,以便特征提取,检测图片等重要内容的进行。在图片检索工作完成后,需要显示和待检索图片相似度前三的图片,运用到本节所说的图片显示工作。
第三章人脸检测与特征提取的方法及软件实现
3.1.1二值化在对图像进行二值化处理前,我们先简单介绍一下二值图像及二值化图像的原因。1.二值图像的定义二值图像指图像中的每个像素只取两个离散的值之一,即非此即他。用数学公式表示为:
(3.1)
(3.2)
其中“1”表示可能的肤色区域,”0”表示其它区域。在图像中,可能的肤色区域显示为白色,其它区域显示为黑色。3.1.2噪声的消除二值化转换后不可避免出现了噪声,有背景的噪声影响,以及人的衣服等引起的噪声点,这里使用开闭运算的方法消除噪声。先腐蚀后膨胀称为开(open),即OPEN(X)=D(E(X)),先膨胀后腐蚀称为闭(close),即CLOSE(X)=E(D(X))。开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),而总的位置和形状不变,闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。膨胀与腐蚀是数学形态中的最基本的操作。设A和B是整数空间Z中的集合,其中A为原始图像,而B为结构元素。则B对A的膨胀运算——记为——定义为:
(3.3)
其中,表示空集,为集合B的反射集:
(3.4)
3.2.2消除噪声的实现由于衣服等噪声的存在,会影响人脸检测的效果,所以这里运用开闭运算实现噪声的消除。se=strel(’square’,3);%生成方形结构元素f=imopen(f,se);%开启操作f=imclose(f,se);%闭合操作figure(2),imshow(f);消除噪声后的图片如图3.3所示:
结果显示,噪声并没有完全消除,还需要进一步改进算法。3.2.3填孔处理和图像重构的实现MATLAB语言中的填孔处理值需要一句简单的语句实现,它将一些不必要的小孔填充掉,使得图像更加简单,易于处理。重构实现了腐蚀后的对象恢复。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);
填孔处理与重构后的图片如图3.4和图3.5所示:
由显示可知,重构后的图片消除了衣服等影响,为人脸区域的检测打好了坚实的基础。3.2.4人脸区域定位的实现1.筛选人脸区域前先利用闭运算操作,断开连接se1=strel(’square’,8);f=imerode(f,se1);f=imdilate(f,se1);%用生成的结构元素对图像进行膨胀figure(6),imshow(f);2.人脸区域的筛选[L,num]=bwlabeln(f,4);fori=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,认为不是%人脸区,删除之.forj=1:temp(1);L(r(j),c(j))=0;endelsecontinue;endend3.边缘检测出人脸L=bwperim(L,8);%边缘检测,检测出人脸的边缘区域L=uint8(L);z=find(L(:)>0);L(z)=255;figure(7),imshow(L);
结果图如图3.7所示:
3.3本章小结这章实现了人脸区域检测的基本功能,利用二值化的图片进行腐蚀、膨胀、重构、人脸区域筛选等操作,最后能够标记出人脸的大概区域。下一章的特征提取需要在此基础进行,人脸区域标记准确,才能提取有用的特征。
第四章图片检索的方法及软件实现
本论文写的基于人脸识别的图片检索是一种基于内容的图片检索。所谓基于内容图片的检索是指由图像分析软件对输入的图片先进行图像分析,根据图像中物体或区域的颜色(color)、形状(shape)或纹理(texture)等特征以及这些特征的组合,自动抽取特征,在将输入图片存入图片库的同时将其相应的特征向量也存入与图片库相连的特征库。在进行检索图像时,对每一幅给定的查询图,进行图像分析,并提取图像特征向量。将该图像的特征向量和特征库中的特征向量进行匹配,根据匹配的结果到图像库中搜索就可以提取出所需要的检索图。基于内容的图片检索是一个逐步求精的过程,大致可以经过以下几个步骤:(1).特征提取对图像数据进行自动或半自动的特征提取,提取用户感兴趣的、适合检索要求的特征。特征提取可以是全局性的,如整幅图像,也可能是针对某个目标,如图像中的子区域等。(2).图像匹配在选取了特征之后,需要选择或寻找适当的判别准则,从而判断出待识别的图像的特征与数据库中的哪些图像的特征最接近。常用的度量准则是距离度量法。(3).结果输出,将满足一定相似性条件的一组候选结果按相似度大小排列后返回给用户。图片检索的流程如图4.1所示:
或(4.2)其中第i个训练样木的图像矢量,m为训练样本集的平均图像矢量,M为训练样本的总数。经过K-L变换,可以得到相应的一组特征矢量,称之为“特征脸”;有了这样一个由“特征脸”张成的降维子空间,任何一幅人脸图像都可以向其做投影并获得一组坐标系数,这组系数表明了该图像在子空间中的位置,从而可以作为人脸识别的依据。4.2.2特征脸的计算做如下的假设人脸图像集:向量形式:则训练集的平均脸:(4.3)
人脸图像与平均脸的差:(4.4)
人脸图像集的协方差矩阵:
(4.5)
用正交变换求出协方差矩阵的特征向量和特征值:变换后的特征空间为:由于离散K-L变换使能量相对集中,且与特征向量相对应的特征值具有如下性质:
因此,对于取前m个特征所对应的特征向量,对原始空间中的向量进行变换,变换后的均方误差取最小值。由于精确地构造图像是不必要的,一个较小的m个特征向量对识别就足够了,因此,我们可以取前m个特征向量,构成变换后的特征脸空间。4.2.3在特征脸空间进行人脸的匹配得到特征脸空间后,对人脸图像的检索可以将原始的高维空间向量映射到该特征空间,再进行模式匹配。一幅人脸图像将它映射到特征脸上可用下式运算求得:
(4.6)它在特征脸空间中的向量:
(4.7)4.3确定相似性度量的方法在基于人脸的图片检索中,以上进行的工作是只是人脸特征提取与选择,下一步要做一工作是对这些提取后的特征向量进行分类。为此要确定一种相似性度量方法,求出各提取后的特征向量之间的相似度,进而确定待分类识别的人脸是否属于某一已知类别。在统计模式识别方法中,我们抽取和选择的是能代表这个模式的特征,用这些特征构成的特征向量占有由它们构成的特征空间的一个点。显然,两个模式如果在模式空间相距很近,则它们的各个分量,也就是各个特征也应相差很小,因此,两个模式之间相似性的一种合理的度量就是它们在特征空间的距离,即距离越小,相似性越高。提起距离,我们首先会想到欧氏距离,即用最小欧氏距离法,对特征向量进行分类和识别。还有一种相似性度量的方法为基于夹角最小的相似性度量方法。4.3.1两种度量方法的比较选择1.夹角最小的相似性度量方法相似性函数定义为两个向量之间的归一化内积,对于某一待分类人脸图像相应的特征向量与第k类人脸图像的特征向量之间的相似度为:
(4.8)
式(4.8)表示的是向量之间的夹角余弦,值越大,表示两者之间的夹角越小,相似性越大。2.欧式距离即两项间的差是每个变量值差的平方和再平方根,目的是计算其间的整体距离,即不相似性。在二维和三维空间中的欧式距离的就是两点之间的距离。二维的公式:(4.9)
三维的公式:(4.10)
推广到n维的公式:
(4.11)在这里我选用了欧式距离算法,得到最小距离,选择与待检索图片的距离最小的前三个图片作为输出结果。4.3.2欧式距离法的运用首先计算出的相应的特征脸模式向量的平均值。确定阈值,它表示距离某一人脸类和距离人脸空间的最大允许值。对于某一待分类人脸图像,则它与第k类的欧氏距离为:
(4.12)当求得的最小的值小于某一给定的阈值,则这幅人脸图像属于该类,否则不属于该类。4.4图片检索的软件实现4.4.1提取特征脸特征脸的提取是对图片库中的图片进行训练的过程。训练过程如下:1.构造训练样本集facecol,即从人脸图像目录中读取多个人脸图像到facecol中;L=10;a=30;b=20;facecol=zeros(a*b,L);fori=1:Lfacecol(:,i)=getFacePile(getpicture(i));end2.计算出所有训练样本的平均脸mx和各训练样本相对于平均脸的差值图像facex;mx=mean(facecol’)';facex=zeros(a*b,L);fori=1:Lfacex(:,i)=facecol(:,i)-mx;end3.用特征值分解的方法求差值图像facex的特征值和特征向量A;%协方差Cf=facex*facex’/L;%特征向量[VD]=eig(Cf);%得到核矩阵A=V’;4.求训练集中的每个差值图像相对于各特征向量上的投影值facey构成的特征脸向量;facey=A*facex;特征脸提取的训练流程图如图4.2所示:
下面给出一些训练过程中得到的矩阵(由于矩阵太大,在这里不一一举出,只列出一部分):1.训练样本集faceco1:
2.训练样本平均脸mx:
图4.4平均脸矩阵3.差值图像facex:
图4.5差值矩阵4.特征脸向量facey:
图4.6特征脸矩阵
4.4.2实现图片检索最后的一步就是实现图片检索功能,输出与待检测图片相似度前三的图片。由于运算速度较慢,这里我选用的图片库含有10张照片。
图4.7图片库
下面将描述MATLAB语言实现的具体过程:1.读取一幅待识别图像;f=getFacePile(path);2.求取该图像相对于平均脸mx的差值图像,再求差值图像在各特征向量上的投影;f=A*(f-mx);3.求该投影值f构成的向量与各类的facey构成的向量之间的欧氏距离d;L=10;d=zeros(1,L);fori=1:Ld(i)=norm(f-facey(:,i));end4.将欧式距离d排序,输出距离最小的前三幅图片%排序[YI]=sort(d);%输出原图imshow(path);title(‘原图’);%输出前三张figure;imshow(getpicture(I(1)));title(‘相似度第一’);figure;imshow(getpicture(I(2)));title(‘相似度第二’);figure;imshow(getpicture(I(3)));title(‘相似度第三’);5.再判断欧式距离是否在一个范围内,如果是的话就继续输出在此范围内的图片。实现检索功能的流程图如4.8所示:
图4.8检索流程图假设我在运行过程中选择的图片为(D:\MatLab7\新建文件夹\work\实验素材\01.bmp)。下面给出检索运行后得到的一些矩阵数据:1.数组I:存储排序后的图片序号
图4.9存储图片排序的数组2.数组d:存储待检索图片与图片库中图片的欧式距离
图4.10欧式距离显示从这组数据中我们可以看到,图片1、2、5是与待检索图片欧式距离最小的,故实验结果将显示这三幅图片。图片检索的结果如图4.12所示:
图4.11待检索图片
图4.12检索结果图4.5本章小结本章是这次设计任务的重要部分,它在前两章的基础上实现了核心内容,通过特征脸的提取与欧式距离的计算,检索出了含有待检索图片人脸的大部分图片,它的准确率较高,但是图片库有一定的限制,我们还知道夹角最小的最近邻法是更优于欧式距离的算法,所以还有待提高算法,提高检索的效率。