一、获取代码方式

获取代码方式1:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

获取代码方式2:
通过紫极神光博客主页开通CSDN会员,凭支付凭证,私信博主,可获得此代码。

获取代码方式3:
完整代码已上传我的资源:【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】

备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通日起,三天内有效);
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、人脸识别技术简介

0 引言
人脸识别技术是计算机视觉和模式识别领域研究的热点问题,被广泛应用于医疗、安全访问控制、机场检查等领域。人脸识别技术易受人脸表情变化、姿态变化、光照变化、遮挡以及采集的高分辨率图像的影响,使得图像隹数增大,因此提高人脸识别算法的鲁棒性,成为了研究的重点方向之一。人脸识别的过程包括特征提取和识别两部分,目前, 人脸图像特征提取和线性降维的方法主要有主成分分析(principal component analysis, PCA) 和线性鉴别分析(linear discriminant analysis, LDA) 等方法 。PCA是一种基于变量协方差矩阵对样本信息进行处理、压缩和提取样本的常用代数特征提取方法,通过K-L变换为基础的无监督特征提取方法,其基本思想是将高维人脸图像投影到低维特征子空间, 使数据在一个低维的特征空间进行处理, 这样在减少数据冗余的同时保持了原始数据的有效性 。LDA算法是一种带有标签的有监督降维方法,其核心是使得投影后的样本类间离散度尽可能大,类内离散度尽可能小。
单一的特征提取方法对人脸的表征能力是有限的, PCA算法对光照和拍摄角度等敏感, 所获取的特征并不是最有效的;而LDA算法能从高维数据空间中提取出具有类别鉴别能力的低维特征, 改善光照不均时图像的识别率。因此本文结合PCA与LDA算法的优缺点, 提出先采用PCA算法对人脸图像进行全局特征提取, 再采用LDA算法进行人脸类别鉴别实现人脸数据的进一步压缩,最后采用最近邻分类器进行识别。

1 融合PCA与LDA的人脸识别算法
一个完整的人脸识别工作系统包括学习训练过程和测试识别过程。采用PCA与LDA算法进行人脸识别框架如图1所示。

图1 PCA算法人脸识别流程
1.1人脸图像采集
采集人脸图像是通过摄像头采集人脸图像,并将其转换为计算机可以处理的数字信号。通过调取笔记本上的摄像头来实时进行每一帧图像的检测, 这里用的是MATLAB视觉工具箱中的webcam, 采集到的图像如图2所示。

1.2人脸检测
人脸检测的任务是判断画面中是否存在人脸,在存在人脸的情况下,提供图像内的坐标位置、面部区域的大小等信息。由肤色信息进行人的面部识别,进而实现对人面部的五官分割。基本步骤如下。
1)读入待检测人脸图像;
2)通过一低通滤波器,滤除高频噪声;
3) 将RGB空间转换为YCbCr空间像素值概率的计算, 再进行预处理;
4)开运算(先腐蚀再膨胀),消除杂散点;
5)根据填充率、面积比及肤色区域的长宽比去除非人脸部分;
6)框出人脸区域。
通过以上步骤进行相关运算处理可得如图3所示的图像。

图3 人脸检测图像

图3 人脸检测图像
1.3 基于PCA的识别算法
所得人脸图像是一个大小为MxN的二维图像, 可以看成长度为MN的人脸图像列向量。为了将二维人脸图像变为列向量,采取的措施为:首先计算出人脸图像的大小,然后将人脸图像经行转置,最后按列依次取出所有灰度值形成大小为MN的一维向量,其实整个阶段的效果相当于将图像的灰度值按行取出依次连接成一维图像向量组成的矩阵T。
1)对图像矩阵T进行规范化
首先计算出图像矩阵T中一维列向量的平均值m,然后对图像矩阵的每一列都减去平均值形成规范化的图像矩阵A,对人脸图像进行规范化后的图像如图4所示。

图4 规范化人脸图像
2)五官分割
Viola-Jones算法是一种非常经典的算法因其高效而快速的检测效果至今仍被波广泛使用[13,14]。该算法包含以下几个重要的部分:
(1) 利用Haar特征描述人脸的共同属性;
(2)建立积分图像的特征,并且基于积分图像,可以快速获取若干不同的矩形特征正;
(3) 利用Adaboost算法进行训练;
(4)建立级联分类器。
调用MATLAB级联对象检测器使用Viola-Jones算法来检测人的面部, 如眼睛嘴巴,对测试图片进行人脸五官分割检测结果如图5所示。

图5 Viola-Jones算法人脸五官检测
3)计算特征脸

4 基于LDA的识别算法
LDA是一种具有监督学习的降维技术, 不同类的样本能尽量分开, 增大类间差异性 .

备注:简介部分仅作为理论参考,与本文程序和运行结果略有出入。

三、部分源代码

clear all
clc
close all
start=clock;
sample_class=1:40;%样本类别
sample_classnum=size(sample_class,2);%样本类别数
fprintf('程序运行开始....................\n\n');for train_samplesize=3:8;train=1:train_samplesize;%每类训练样本test=train_samplesize+1:10;%每类测试样本train_num=size(train,2);%每类训练样本数test_num=size(test,2);%每类测试样本数address=[pwd '\ORL\s'];%读取训练样本allsamples=readsample(address,sample_class,train);%先使用PCA进行降维[newsample base]=pca(allsamples,0.9);%计算Sw,Sb[sw sb]=computswb(newsample,sample_classnum,train_num);%读取测试样本testsample=readsample(address,sample_class,test);best_acc=0;%最优识别率%寻找最佳投影维数for temp_dimension=1:1:length(sw)vsort1=projectto(sw,sb,temp_dimension);%训练样本和测试样本分别投影tstsample=testsample*base*vsort1;trainsample=newsample*vsort1;%计算识别率accuracy=computaccu(tstsample,test_num,trainsample,train_num);if accuracy>best_accbest_dimension=temp_dimension;%保存最佳投影维数best_acc=accuracy;endend%---------------------------------输出显示----------------------------------fprintf('每类训练样本数为:%d\n',train_samplesize);fprintf('最佳投影维数为:%d\n',best_dimension);fprintf('FisherFace的识别率为:%.2f%%\n',best_acc*100);fprintf('程序运行时间为:%3.2fs\n\n',etime(clock,start));
end
function [newsample basevector]=pca(patterns,num)
%主分量分析程序,patterns表示输入模式向量,num为控制变量,当num大于1的时候表示
%要求的特征数为num,当num大于0小于等于1的时候表示求取的特征数的能量为num
%输出:basevector表示求取的最大特征值对应的特征向量,newsample表示在basevector
%映射下获得的样本表示。
[u v]=size(patterns);
totalsamplemean=mean(patterns);
for i=1:ugensample(i,:)=patterns(i,:)-totalsamplemean;
end
sigma=gensample*gensample';
[U V]=eig(sigma);
d=diag(V);
[d1 index]=dsort(d);
if num>1for i=1:numvector(:,i)=U(:,index(i));base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);end
elsesumv=sum(d1);for i=1:uif sum(d1(1:i))/sumv>=numl=i;break;endendfor i=1:lvector(:,i)=U(:,index(i));base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);end
end
function sample=readsample(address,classnum,num)
%这个函数用来读取样本。
%输入:address就是要读取的样本的地址,classnum代表要读入样本的类别,num是每类的样本;
%输出为样本矩阵
allsamples=[];
image=imread([pwd '\ORL\s1_1.bmp']);%读入第一幅图像
[rows cols]=size(image);%获得图像的行数和列数
for i=classnumfor j=numa=imread(strcat(address,num2str(i),'_',num2str(j),'.bmp'));b=a(1:rows*cols);b=double(b);allsamples=[allsamples;b];end
end

四、运行结果

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]孟逸凡,柳益君.基于PCA-SVM的人脸识别方法研究[J].科技视界. 2021,(07)
[6]张娜,刘坤,韩美林,陈晨.一种基于PCA和LDA融合的人脸识别算法研究[J].电子测量技术. 2020,43(13)
[7]陈艳.基于BP神经网络的人脸识别方法分析[J].信息与电脑(理论版). 2020,32(23)
[8]戴骊融,陈万米,郭盛.基于肤色模型和SURF算法的人脸识别研究[J].工业控制计算机. 2014,27(02)

【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】相关推荐

  1. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  2. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

  3. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  4. 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]KL变换人脸识别[含GUI源码 859期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  5. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

  6. 【Matlab身份证识别】身份证号码识别【含GUI源码 014期】

    一.代码运行视频(哔哩哔哩) [Matlab身份证识别]身份证号码识别[含GUI源码 014期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  7. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别门禁系统[含GUI源码 1692期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继 ...

  8. 【Matlab指纹识别】指纹识别匹配门禁系统【含GUI源码 587期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别匹配门禁系统[含GUI源码 587期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  9. 【Matlab水果识别】苹果质量检测及分级系统(带面板)【含GUI源码 1613期】

    一.代码运行视频(哔哩哔哩) [Matlab水果识别]苹果质量检测及分级系统(带面板)[含GUI源码 1613期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  10. 【Matlab车牌识别】停车计费系统【含GUI源码 735期】

    一.代码运行视频(哔哩哔哩) [Matlab车牌识别]停车计费系统[含GUI源码 735期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLA ...

最新文章

  1. Cent OS – Tomcat 7 - 集群
  2. web签名验证程序【跨服务器、中文字符签名方法】-php为例
  3. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )
  4. vue 非template模式_vue-template-compiler 还能这么用
  5. linux可以生成pdb调试信息吗,Linux通过使用pdb简单调试python计划
  6. python清空列表clear_如何在Python中清空列表?
  7. 使用Express在Node.js中实现非常基本的路由
  8. Hadoop 面试,来看这篇就够了
  9. log4j.properties配置与将异常输出到Log日志文件实例
  10. 终结VC2005分发包版本问题
  11. Python数据库模块pymssql连接SQLServer数据库操作详解
  12. 【kmp专题】牛客网子串(进制转化+kmp/string.find())
  13. rf扫描枪_RF枪_RF手持扫描枪_RF手持机
  14. 河南职称计算机考试多少分通过,2019年河南职称计算机考试报名通知
  15. 用C语言写一个图书管理系统大作业
  16. WebStorm快捷键及配置
  17. Gamemaker studio2经验(3)——昼夜更替效果实现
  18. stick棍子by Ye
  19. 2021SC@SDUSC HBase(十三)项目代码分析——WAL写入
  20. ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试

热门文章

  1. ActiveMQ实现负载均衡+高可用部署方案 -转载
  2. 【ImageMagick】ImageMagick命令行工具
  3. Flash上传文件(结合asp.net) (转)
  4. 190315每日一句
  5. unity 找到的对象是动态加载,且两个不同的父物体上都有要的那个对象并有相同的名子
  6. Atitit maven 常见类库配置法 maven common lib jar v2 t88 目录 1. Express DSL COMMON 2 1.1. Ognl 2 1.2. veloci
  7. Atitit 数据库的历史与未来 目录 1.1. 两个对于数据库强需求的行业。电信 金融 1 1.2. 艾提拉分析 对数据库强需求行业金融 1 2. 数据库历史 2 2.1. ,上个世纪50,6
  8. PAIP.paip.手机离线ROOT过程总结
  9. 人力资源SaaS“一哥”,二十年艰难进化
  10. 微服务架构与API网关