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

1  PCA主成分分析

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

1.1  样本图像预处理

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

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

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

处理后效果如图1:

图1 灰度转换对比图

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

namud = 0.5;  

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

pic1 = imresize(pic1,namud);  

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

[m,n] = size(pic1);

pic_all = {pic1,pic2,pic3,pic4,pic5,pic6,pic7,pic8,pic9,pic10};

for i=1:10

FaceData(i,:) = reshape(pic_all{i},1,m*n);

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的算法,故需要进行对测试图像进行像素的转换,并保存转换后的图像,其代码如下:

[filename,pathname]=uigetfile('*','choose a picture');

path=[pathname,filename];

Origimg=imread(path);

img=imresize(Origimg,[180 150]);

path='E:\Matlab_face';

filename = 'test.jpg';

newpath=fullfile(path,filename);

imwrite(img,newpath,'jpg');

对测试图像的预处理与对样本图像的预处理一致。其代码如下:

pic = rgb2gray(img2find);   

pic = imresize(pic,namud);

[m2,n2] = size(pic);

pic = reshape(pic,1,m2*n2);

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维后的数据其具体代码如下:

function Cell_all = PCA(img,k)  

[m,n] = size(img);

img_mean = mean(img);

img_mean_all = repmat(img_mean,m,1);

Z = img - img_mean_all;

T = Z'*Z/m;    

[V,D] = eigs(T,k);

img_new = img*V*D;  

Cell_all = {img_new,V,D};

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

pic_done = pic*V*D ;

3 判别图像间的相似性

3.1最小距离法

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

for i=1:m1  

    face(i) = norm(img_all(i,:)-pic_done);  

end  

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

  • 20
    点赞
  • 224
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: PCA(Principal Component Analysis,主成分分析)是一种常用的人脸识别方法,它是一种基于数学统计原理的降维技术。基于MatlabPCA人脸识别毕业设计主要包括以下几个方面: 首先,需要收集一批人脸图像数据集,并对其进行预处理。预处理包括图像的灰度化、尺寸统一、对比度增强等,以便后续的人脸特征提取。 接着,通过Matlab图像处理工具箱,对预处理后的人脸图像进行特征提取。常用的特征提取方法是将每张人脸图像转换为一个低维特征向量。在PCA中,可以将每个人脸图像看作是一个数据点,通过线性变换将其映射到一个新的空间中。该线性变换是通过计算人脸图像数据集的协方差矩阵的特征值和特征向量来完成的。选择协方差矩阵特征值较大对应的特征向量作为主成分,将特征投影到主成分空间中,得到低维的特征向量。 然后,根据提取的特征向量构建人脸识别模型。可以选择使用最近邻分类器或支持向量机分类器等方法。在训练阶段,使用已知标签的人脸图像数据集进行模型训练。训练完成后,对于未知人脸进行识别时,将其提取的特征向量投影到主成分空间中,然后使用分类器进行分类,最终得到人脸识别的结果。 最后,需要对设计进行评估和优化。评估可以使用交叉验证等方法,计算模型在测试集上的识别准确率。如果准确率较低,可以考虑调整PCA中的主成分数量或选择其他特征提取方法来优化模型。 总之,基于MatlabPCA人脸识别毕业设计可以通过数据集收集、图像处理、特征提取、模型构建和评估优化等步骤完成,最终实现对人脸的准确识别。 ### 回答2: 基于matlabpca人脸识别是一种利用主成分分析(Principal Component Analysis,PCA算法实现的人脸识别系统。在毕业设计中,我将设计一个完整的pca人脸识别系统并进行实验验证。 首先,我会收集一个包含多个人脸图像的训练数据集。这些图像可以来自于公开的人脸数据库或者自己采集。接着,我会使用matlab对这些训练图像进行预处理,包括灰度化、图像增强等操作。 之后,我将采用PCA算法对预处理后的人脸图像进行降维处理。PCA算法能够将高维的图像数据转换为低维的特征空间,通过选取主成分来保留最重要的人脸特征。通过提取出的特征向量可以构建一个人脸特征空间。 接下来,我会选择一个合适的距离度量方法,如欧氏距离或余弦相似度,来度量测试图像与训练集中每个人脸图像之间的相似度。在利用这个相似度进行判定时,如果测试图像与某个训练图像的相似度高于一个设定的阈值,则可以认为该测试图像属于该人脸。 最后,我将使用一些性能评价指标,如准确率、召回率和F1值,来评估我设计pca人脸识别系统的性能。通过分析和比较这些指标,我可以评估系统的准确性和稳定性。 总之,基于matlabpca人脸识别毕业设计将涉及到数据收集、预处理、PCA降维、距离度量和性能评估等步骤。通过这个设计,我希望能够实现一个准确、高效并且稳定的人脸识别系统,并为人脸识别领域做出一定的贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值