当前位置:   article > 正文

基于Matlab的人脸识别设计(PCA)_基于matlab人脸识别

基于matlab人脸识别

1  PCA主成分分析

图像预处理是人脸识别的重要组成部分。由于图像采集环境不同,输入测试图像常常存在一些问题,如不同程度的噪声和图像对比度不足。再者,获取距离和焦距大小之类的外部因素也使得面部信息在整个图像中具有不确定的大小和位置。为了确保收集的面部图像的质量,必须在识别之前预处理测试图像。所以下文将会对本次设计中的图像预处理过程进行介绍。

1.1  样本图像预处理

样本图像的选择与处理是实现人脸识别的基础,故在选择样本图像时要进行人为的干预。首先样本图像要保证人物特征的明显与背景单一,才能使尽可能多的与人脸相关的关键被保留下来。其次是图像的分辨率和宽高比。在进行之后的图像处理时,相同的分辨率可以便于程序对图像进行更高效的运算。而相同的宽高比将会使样本图像的变量刚好的控制在图像本事,使本次课程设计更具有说明性。

确定好样本图像后,需要对图像进行灰度处理。因为拍摄环境、光圈、样本图像人物的身体状况不同,会产生不同色彩的人脸信息,这些色彩的不同会影响对图像人脸本身的特征识别。同时传统的彩色RGB图像数据量过大,所以处理彩色图像时其运算会时间过高。灰度处理代码如下:

pic1 = rgb2gray(imread('1.jpg'));

处理后效果如图1:

图1 灰度转换对比图

图像数据量和图像的大小有着直接的关系,即使是将图像像素缩至150*180后(PS:此处为小弟手动更改的像素),也会出现数据量过大导致运行缓慢的现象。所以需要对灰度处理后的的图形进行缩小。具体代码如下:

  1. namud = 0.5;  
  2. pic1 = rgb2gray(imread('1.jpg'));
  3. pic1 = imresize(pic1,namud);  

在完成了样本图像外观上的所有操作后,则需要对其转化后的数据进行储存,为方便后续操作,可将所有的样本图像以多个矩阵的方式储存在一个细胞体结构中,并计算得到某一个图像的矩阵行列大小(m、n),从而将一个细胞体中的所有行为m、列为n的矩阵,转化成大小为n*m的列矩阵,这样方便后续的PCA算法运算。上述过程的代码如下:

  1. [m,n] = size(pic1);
  2. pic_all = {pic1,pic2,pic3,pic4,pic5,pic6,pic7,pic8,pic9,pic10};
  3. for i=1:10
  4. FaceData(i,:) = reshape(pic_all{i},1,m*n);
  5. end

为了节省存储空间,Matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像。当使用函数imread()时,其会把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。因此,Matlab读入图像的数据是uint8,而Matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,即将uint8(0-255范围类型)准换为double(0-1范围类型)。其代码如下:

FaceData = double(FaceData)/255; 

至此对样本图像的预处理全部结束,接下来则需要对其进行运算得到其图像特征,从而进行与测试人脸的图像识别。

1.2  测试图像预处理

测试图像即需要进行人脸识别与数据库中进行比对的图像,但在处理之前因为后续使用的PCA的算法,故需要进行对测试图像进行像素的转换,并保存转换后的图像,其代码如下:

  1. [filename,pathname]=uigetfile('*','choose a picture');
  2. path=[pathname,filename];
  3. Origimg=imread(path);
  4. img=imresize(Origimg,[180 150]);
  5. path='E:\Matlab_face';
  6. filename = 'test.jpg';
  7. newpath=fullfile(path,filename);
  8. imwrite(img,newpath,'jpg');
  9. 对测试图像的预处理与对样本图像的预处理一致。其代码如下:
  10. pic = rgb2gray(img2find);   
  11. pic = imresize(pic,namud);
  12. [m2,n2] = size(pic);
  13. pic = reshape(pic,1,m2*n2);
  14. pic = double(pic)/255;

2 PCA主成分分析

PCA(Principal Component Analysis,主成分分析)是一种常用的数据分析方法。它是一种对数据进行分析的技术,最重要的应用是对原有数据进行简化。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。这种方法可以有效的找出数据中最“主要”的元素和结构,去除噪音和冗余,将原有的复杂数据降维,揭示隐藏在复杂数据背后的简单结构。它的优点是简单,而且无参数限制,可以方便的应用与各个场合。

2.1 PCA算法分析

表1 PCA算法分析所涉及的变量说明

变量名称

变量说明

m

样本图像个数

Cell

样本图像矩阵

avg

均值

n

样本矩阵中最大列数

Z

减去均值后的样本矩阵

C

协方差矩阵

Y

降维后的图像矩阵

T

表转置

V

协方差矩阵的特征值

D

协方差矩阵特征值对应的特征向量

将每一张样本图像转换为大小为n(1*75*90)的列向量Xm,并储存在一个矩阵中。所得样本矩阵可表示为:

样本矩阵的每一进行零均值化求样本矩阵中每列的均值,并转化为行向量,再转化为行为m列为n的矩阵即得到均值向量(Avg),使细胞体向量中与均值向量相减,即完成对样本矩阵的零均值化

计算协方差矩阵:

求出协方差矩阵的特征值V及对应的特征向量D将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

将样本数据与矩阵P相乘,即得到降维到k维后的数据

至此PCA过程完成。

2.2.2 PCA代码应用

经过上文的PCA算法分析我们可以基本得到其运算流程。以m条n维数据为例,即将原始数据按列组成n行m列矩阵X将X的每一行进行零均值化,即减去这一行的均值求出协方差矩阵 求出协方差矩阵的特征值及对应的特征向量将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵PY=PX即为降维到k维后的数据其具体代码如下:

  1. function Cell_all = PCA(img,k)  
  2. [m,n] = size(img);
  3. img_mean = mean(img);
  4. img_mean_all = repmat(img_mean,m,1);
  5. Z = img - img_mean_all;
  6. T = Z'*Z/m;    
  7. [V,D] = eigs(T,k);
  8. img_new = img*V*D;  
  9. Cell_all = {img_new,V,D};

通过以上代码即可实现对样本人脸图片的降维与数据处理。同时因为处理测试人脸图像使用的也为PCA故其代码与上面类似即:

pic_done = pic*V*D ;

3 判别图像间的相似性

3.1最小距离法

在样本人脸照片完成了预处理和PCA运算后,即将所有的样本人脸数据都存储在一个人脸库中。再将测试人脸照片完成预处理与PCA运算后,得到其运算后的数据。之后便确定图像间的相似性,即判断测试图像与样本图像之间的关系,并找到测试图像对应的样本图像,从而实现人脸识别功能。在这里选用最小距离法来判定图像间的相似性,从而实现人脸识别,具体代码如下

  1. for i=1:m1  
  2.     face(i) = norm(img_all(i,:)-pic_done);  
  3. end  
  4. FaceFind = find(face == min(face));  

在这里我们把PCA之后的图像映射到坐标之间的几何距离作为评判与哪一个人脸最近的标准 。其中黑色圆点为待识别图像坐标,红色圆点为匹配图像坐标,可见其两点的距离最近。

参考文献

  1. 左腾. 人脸识别技术综述[J]. 软件导刊, 2017 182-185.
  2. GatsbyNewton. PCA算法详解PCA算法详解_GatsbyNewton-CSDN博客_pca算法. CSDN,2015
  3. 王文庆.人脸识别原理与实践[M].北京:中国工信出版社,2018.3:27-40
  4. 周品.Matlab图像处理与图形应用界面[M].北京:清华大学出版社,2013:397-435

PS:1.极其建议大家阅读 PCA算法详解_GatsbyNewton-CSDN博客_pca算法PCAPCA(Principal Component Analysis,主成分分析)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。网上关于PCA的文章有很多,但是大多数只描述了PCA的分析过程,而没有讲述其中的原理。这篇文章的目的是介绍PCA的基本数学原理,帮助读者了解PCA的工作机制是什么。当然我https://blog.csdn.net/u010376788/article/details/46957957

        2.本文的人脸识别率不高,但是应对一般的课程设计还是可以,毕竟不会有人真的一张一张的数你的照片匹配率。

        3.其他函数知识点:

matlab中 rgb2gray() 函数 具体实现_corilei的博客-CSDN博客_rgb2gray函数            简介    rgb2gray是matlab内部一种处理图像的函数,通过消除图像色调和饱和度信息同时保留亮度实现将将RGB图像或彩色图转换为灰度图像,即灰度化处理的功能,调用这个功能的格式是I = rgb2gray(RGB),意思是将真彩色图像RGB转换为灰度强度图像I 。        调用格式I = rgb2gray(RGB)newmap= rgb2gray(map)函数...https://blog.csdn.net/corilei/article/details/80559448matlab的imread_深藏功与名-CSDN博客_imread函数 matlabimread(matlab)                                            函数语法 A = imread(filename, fmt)[X, map] = imread(...)[...] = imread(filename)[...] = imread(URL,...)[...] = imread(https://blog.csdn.net/langb2014/article/details/48465795Matlab中cell数组的使用_ljh0302的专栏-CSDN博客_matlab读取cell数组转载地址:http://www.matlabsky.com/forum.php?mod=viewthread&tid=21089从celll使用说起在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高不少~无论是Import Data还是使用textscan之类获取数据,从长期使用高级语言的角度https://blog.csdn.net/ljh0302/article/details/50819018MATLAB的reshape函数_xtingjie的博客-CSDN博客_reshape函数matlab用法一作用是将4*6的A,变成6*4的B,数据排列规则:对A逐列扫描,对B逐列填充,也就是先处理完第一列,在处理第二列,再第三列。。。用法二 A是4*6的,C是2*3*4的,都有24个元素,变换前后的矩阵元素个数一样总结reshape函数总是将原矩阵A,重组为新矩阵B,这里A、B元素个数需相同。重组的规则如下: 总是先处理低维的,再处理高维的,比如要把4*6的A变为6*4的B,就要先扫描A的第一https://blog.csdn.net/xtingjie/article/details/70991097matlab图像uint8和double的关系,除以255乘以255_三眼二郎-CSDN博客_matlab uint8和doublematlab默认图像的储存和读取方式为uint8但是为了计算和表达方便matlab针对uint8和double都有相应操作有时我们会疑惑一会iMG = double(img);imshow(uint8(IMG)*25)一会imshow(IMG)imwrite同样有如此操作为什么呢??????????我们在使用时可以分成两个体系在用uint8时,matlab默认图像为[0,2...https://blog.csdn.net/a6333230/article/details/96474738matlab中repmat函数的用法_恰同学少年的博客-CSDN博客_repmat函数matlabB = repmat(A,m,n)B = repmat(A,[m n])B = repmat(A,[m n p...])这是一个处理大矩阵且内容有重复时使用,其功能是以A的内容堆叠在(MxN)的矩阵B中,B矩阵的大小由MxN及A矩阵的内容决定,如果A是一个3x4x5的矩阵,有B = repmat(A,2,3)则最后的矩阵是6x12x5例如:>>B=repmat( [1https://blog.csdn.net/majinlei121/article/details/50762997图像处理中uint8和double的问题_大丈夫-CSDN博客_uint8和double为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像。imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。因此,matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,I2=im2double(I1)https://blog.csdn.net/yjl9122/article/details/50937966

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/250023
推荐阅读
相关标签
  

闽ICP备14008679号