本文转自:http://www.cnblogs.com/mikewolf2002/p/3432243.html

PCA算法的基本原理可以参考:http://www.cnblogs.com/mikewolf2002/p/3429711.html

对一副宽p、高q的二维灰度图,要完整表示该图像,需要m = p*q维的向量空间,比如100*100的灰度图像,它的向量空间为100*100=10000。下图是一个3*3的灰度图和表示它的向量表示:

该向量为行向量,共9维,用变量表示就是[v0, v1, v2, v3, v4, v5, v6, v7, v8],其中v0...v8,的范围都是0-255。

现在的问题是假如我们用1*10000向量,表示100*100的灰度图,是否向量中的10000维对我们同样重要?肯定不是这样的,有些维的值可能对图像更有用,有些维相对来说作用小些。为了节省存储空间,我们需要对10000维的数据进行降维操作,这时就用到了PCA算法,该算法主要就是用来处理降维的,降维后会尽量保留更有意义的维数,它的思想就是对于高维的数据集来说,一部分维数表示大部分有意义的数据。

算法的基本原理:

假设   表示一个特征向量,其中 【注:xi可能也是一个列向量】

1.计算均值向量

2.计算协方差矩阵 S

3.计算S的特征值   和对应的特征向量,根据线性代数知识我们知道有公式:

4. 对特征值按照大小进行递减排序,特征向量的顺序和特征值是一致的。假设我们只需要保留K个维数(K<n),则我们会选取特征值最大的前K个特征向量,用这K个特征向量,来表示图像,这K个向量就是图像K个主成分分量。

对于被观测的向量,它的K个主成分量可以通过下面公式计算得到:

,其中

因为W是正交矩阵,所有有

下面我们在OpenCV中看一个计算PCA的例子:

1.首先读入10副人脸图像,这些图像大小相等,是一个人的各种表情图片。

2.把图片转为1*pq的一维形式,p是图像宽,q是图像高。这时我们的S矩阵就是10行,每行是pq维的向量。

3.然后我们在S上执行PCA算法,设置K=5,求得5个特征向量,这5个特征向量就是我们求得的特征脸,用这5个特征脸图像,可以近似表示之前的十副图像。

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"#include <iostream>
#include <fstream>
#include <sstream>using namespace cv;
using namespace std;//把图像归一化为0-255,便于显示
Mat norm_0_255(const Mat& src){Mat dst;switch(src.channels()){case 1:cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);break;case 3:cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC3);break;default:src.copyTo(dst);break;}return dst;}//转化给定的图像为行矩阵
Mat asRowMatrix(const vector<Mat>& src, int rtype, double alpha = 1, double beta = 0){//样本数量
    size_t n = src.size();//如果没有样本,返回空矩阵
    if(n == 0)return Mat();//样本的维数
    size_t d = src[0].total();Mat data(n, d, rtype);//拷贝数据
    for(int i = 0; i < n; i++){if(src[i].empty()) {string error_message = format("Image number %d was empty, please check your input data.", i);CV_Error(CV_StsBadArg, error_message);}// 确保数据能被reshape
        if(src[i].total() != d) {string error_message = format("Wrong number of elements in matrix #%d! Expected %d was %d.", i, d, src[i].total());CV_Error(CV_StsBadArg, error_message);}Mat xi = data.row(i);//转化为1行,n列的格式
        if(src[i].isContinuous()){src[i].reshape(1, 1).convertTo(xi, rtype, alpha, beta);} else {src[i].clone().reshape(1, 1).convertTo(xi, rtype, alpha, beta);}}return data;}int main(int argc, const char *argv[]){vector<Mat> db;string prefix = "../att_faces/";db.push_back(imread(prefix + "s1/1.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/2.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/3.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/4.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/5.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/6.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/7.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/8.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/9.pgm", IMREAD_GRAYSCALE));db.push_back(imread(prefix + "s1/10.pgm", IMREAD_GRAYSCALE));// Build a matrix with the observations in row:
    Mat data = asRowMatrix(db, CV_32FC1);// PCA算法保持5主成分分量
    int num_components = 5;//执行pca算法
    PCA pca(data, Mat(), CV_PCA_DATA_AS_ROW, num_components);//copy  pca算法结果
    Mat mean = pca.mean.clone();Mat eigenvalues = pca.eigenvalues.clone();Mat eigenvectors = pca.eigenvectors.clone();//均值脸
    imshow("avg", norm_0_255(mean.reshape(1, db[0].rows)));//五个特征脸
    imshow("pc1", norm_0_255(pca.eigenvectors.row(0)).reshape(1, db[0].rows));imshow("pc2", norm_0_255(pca.eigenvectors.row(1)).reshape(1, db[0].rows));imshow("pc3", norm_0_255(pca.eigenvectors.row(2)).reshape(1, db[0].rows));imshow("pc4", norm_0_255(pca.eigenvectors.row(3)).reshape(1, db[0].rows));imshow("pc5", norm_0_255(pca.eigenvectors.row(4)).reshape(1, db[0].rows));while(1)waitKey(0);// Success!
    return 0;}

我们输入的10副图像为:

得到的5副特征脸为:

均值脸为:

程序代码:参照工程FirstOpenCV32

人脸识别特征脸提取PCA算法相关推荐

  1. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  2. python人脸识别特征脸法_人脸识别经典算法一 特征脸方法(Eigenface)

    这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...

  3. python人脸识别特征脸法_人脸识别经典算法:特征脸方法(Eigenface)

    特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在之前的文章中已经讲过了.直接上特征脸方法的步骤: 步骤一:获取包含M张人脸图像的集合S.在我们的 ...

  4. 人脸识别—特征脸方法

    人脸识别之特征脸方法(Eigenface) zouxy09@qq.com http://blog.csdn.net/zouxy09 因为需要,花了一点时间写了下经典的基于特征脸(EigenFace)的 ...

  5. 人脸识别:特征脸(Eigenface)

    Eigenface就是将人脸图像进行编码,映射到低维子空间上,在低维空间计算两幅人脸图像的距离,以此来进行人脸识别.映射到低维子空间的方法采用主成分分析(Principal Component Ana ...

  6. 【人脸识别】基于主成分分析PCA算法人脸识别门禁系统含Matlab源码

    1 简介 人脸是反应人身份的最直接的,最可靠的信息资源.通过人脸我们可以很快辨识一个人,这就是所谓的人脸识别.最初的人脸研究人员是一些从事社会心理学的工作者,从20世纪50年代开始有一些文献资料陆续发 ...

  7. 人脸识别中的活体检测算法

    人脸识别中的活体检测算法综述 1. 什么是活体检测? 判断捕捉到的人脸是真实人脸,还是伪造的人脸攻击(如:彩色纸张打印人脸图,电子设备屏幕中的人脸数字图像 以及 面具 等) 2. 为什么需要活体检测? ...

  8. 人脸识别特征介绍以及难题概括

    科技的发展,人脸识别技术正广泛应用在我们的生活,也在逐渐改变我们的生活,给我们带来更多的方便.今天给大家介绍一下人脸识别特征有哪些?人脸识别技术的应用有哪些难题存在呢? 人脸识别特征介绍 1.几何特征 ...

  9. 计算机视觉子方向,计算机视觉方向简介 | 人脸识别中的活体检测算法综述

    原标题:计算机视觉方向简介 | 人脸识别中的活体检测算法综述 本文转载自"SIGAI人工智能学习与实践平台"(ID:SIGAICN) 导言 1. 什么是活体检测? 判断捕捉到的人脸 ...

最新文章

  1. Java:希望每天叫醒你的不是闹钟而是梦想!
  2. 【CyberSecurityLearning 15】VLAN技术与Trunk
  3. 怎么打包图片_超简单的免费批量图片压缩技巧,只需3步
  4. java老鸟123怎么样_java入门123——一个老鸟的java学习心得.doc
  5. 【好文链接】什么是开环控制?什么是闭环控制?区别在哪里?
  6. NLP学习—21.自注意力机制(Self-Attention)与Transformer详解
  7. unity 小tip
  8. Xamarin iOS教程之使用按钮接接收用户输入
  9. 2022危险化学品经营单位安全管理人员考试模拟100题及模拟考试
  10. 企业运维实战--k8s学习笔记.k8s容器资源限制 Metrics-Server部署 图形化监控Dashboard部署 K9S的安装
  11. spfa算法(c++)
  12. android rmvb格式下载,rmvb格式转换器安卓版
  13. 启动windows的mysql_MySQL的启动方法(windows 平台)
  14. 计算机配置的内存容量为4GB,电脑添加4G内存条后内存容量没有变化怎么办
  15. element Table el-tooltip
  16. 希望我们不要忘记喜欢过的,喜欢着的
  17. Word处理控件Aspose.Words功能演示:使用 C# 将 Word 文档转换为 Markdown
  18. html5 Doctor——教你规范使用html5标签
  19. 瞬态抑制二极管与稳压二极管的区别
  20. 天池-金融风控训练营-task5-模型融合

热门文章

  1. python pandas 增加一列_Python之pandas新增列
  2. 清风数学建模笔记——Excel画图保姆级教学
  3. 【5G MAC】RA-RNTI的计算过程
  4. 我滴python第一周笔记
  5. Vivado使用技巧(17):时序异常 Timing Exception
  6. 【PMP】项目经理PM 和 项目管理办公室PMO 的区别
  7. 一周肝出Linux之远程服务详解(ssh远程登录、scp远程复制、sftp安全下载、TCP Wrappers访问控制)
  8. 系统里能看服务器型号,操作系统如何查看服务器型号
  9. 问题 D: 清点人数
  10. java开发微信公众号图片上传功能,不吃透都对不起自己