MATLAB下人脸图像的PCA重构matlab代码
LDA人脸识别的matlab程序

LDA人脸识别的matlab程序以下是LDA的m文件函数:你稍稍改改就能用了!function [eigvector, eigvalue, elapse] = LDA(gnd,options,data)% LDA: Linear Discriminant Analysis%% [eigvector, eigvalue] = LDA(gnd, options, data)%% Input:% data - Data matrix. Each row vector of fea is a data point. % gnd - Colunm vector of the label information for each% data point.% options - Struct value in Matlab. The fields in options% that can be set:%% Regu - 1: regularized solution,% a* = argmax(a'X'WXa)/(a'X'Xa+ReguAlpha*I)% 0: solve the sinularity problem by SVD% Default: 0%% ReguAlpha - The regularization parameter. Valid% when Regu==1. Default value is 0.1.%% ReguType - 'Ridge': Tikhonov regularization% 'Custom': User provided% regularization matrix% Default: 'Ridge'% regularizerR - (nFea x nFea) regularization % matrix which should be provided% if ReguType is 'Custom'. nFea is% the feature number of data % matrix% Fisherface - 1: Fisherface approach% PCARatio = nSmp - nClass% Default: 0%% PCARatio - The percentage of principal% component kept in the PCA% step. The percentage is % calculated based on the % eigenvalue. Default is 1 % (100%, all the non-zero % eigenvalues will be kept. % If PCARatio > 1, the PCA step% will keep exactly PCARatio principle% components (does not exceed the% exact number of non-zero components).%%% Output:% eigvector - Each column is an embedding function, for a new% data point (row vector) x, y = x*eigvector% will be the embedding result of x.% eigvalue - The sorted eigvalue of LDA eigen-problem.% elapse - Time spent on different steps%% Examples:%% fea = rand(50,70);% gnd = [ones(10,1);ones(15,1)*2;ones(10,1)*3;ones(15,1)*4];% options = [];% options.Fisherface = 1;% [eigvector, eigvalue] = LDA(gnd, options, fea);% Y = fea*eigvector;%%% See also LPP, constructW, LGE%%%%Reference:%% P. N. Belhumeur, J. P. Hespanha, and D. J. Kriegman, 揈igenfaces % vs. fisherfaces: recognition using class specific linear% projection,� IEEE Transactions on Pattern Analysis and Machine% Intelligence, vol. 19, no. 7, pp. 711-720, July 1997.%% Deng Cai, Xiaofei He, Yuxiao Hu, Jiawei Han, and Thomas Huang,% "Learning a Spatially Smooth Subspace for Face Recognition", CVPR'2007%% Deng Cai, Xiaofei He, Jiawei Han, "SRDA: An Efficient Algorithm for % Large Scale Discriminant Analysis", IEEE Transactions on Knowledge and% Data Engineering, 2007.%% version 2.1 --June/2007% version 2.0 --May/2007% version 1.1 --Feb/2006% version 1.0 --April/2004%% Written by Deng Cai (dengcai2 AT )%if ~exist('data','var')global data;endif (~exist('options','var'))options = [];endif ~isfield(options,'Regu') | ~options.RegubPCA = 1;if ~isfield(options,'PCARatio')options.PCARatio = 1;endelsebPCA = 0;if ~isfield(options,'ReguType')options.ReguType = 'Ridge';endif ~isfield(options,'ReguAlpha')options.ReguAlpha = 0.1;endendtmp_T = cputime;% ====== Initialization[nSmp,nFea] = size(data);if length(gnd) ~= nSmperror('gnd and data mismatch!');endclassLabel = unique(gnd);nClass = length(classLabel);Dim = nClass - 1;if bPCA & isfield(options,'Fisherface') & options.Fisherface options.PCARatio = nSmp - nClass;endif issparse(data)data = full(data);endsampleMean = mean(data,1);data = (data - repmat(sampleMean,nSmp,1));bChol = 0;if bPCA & (nSmp > nFea+1) & (options.PCARatio >= 1) DPrime = data'*data;DPrime = max(DPrime,DPrime');[R,p] = chol(DPrime);if p == 0bPCA = 0;bChol = 1;endend%======================================% SVD%======================================if bPCAif nSmp > nFeaddata = data'*data;ddata = max(ddata,ddata');[eigvector_PCA, eigvalue_PCA] = eig(ddata);eigvalue_PCA = diag(eigvalue_PCA);clear ddata;maxEigValue = max(abs(eigvalue_PCA));eigIdx = find(eigvalue_PCA/maxEigValue < 1e-12);eigvalue_PCA(eigIdx) = [];eigvector_PCA(:,eigIdx) = [];[junk, index] = sort(-eigvalue_PCA);eigvalue_PCA = eigvalue_PCA(index);eigvector_PCA = eigvector_PCA(:, index);%=======================================if options.PCARatio > 1idx = options.PCARatio;if idx < length(eigvalue_PCA)eigvalue_PCA = eigvalue_PCA(1:idx);eigvector_PCA = eigvector_PCA(:,1:idx);endelseif options.PCARatio < 1sumEig = sum(eigvalue_PCA);sumEig = sumEig*options.PCARatio;sumNow = 0;for idx = 1:length(eigvalue_PCA)sumNow = sumNow + eigvalue_PCA(idx);if sumNow >= sumEigbreak;endendeigvalue_PCA = eigvalue_PCA(1:idx);eigvector_PCA = eigvector_PCA(:,1:idx);end%=======================================eigvalue_PCA = eigvalue_PCA.^-.5;data = (data*eigvector_PCA).*repmat(eigvalue_PCA',nSmp,1);elseddata = data*data';ddata = max(ddata,ddata');[eigvector, eigvalue_PCA] = eig(ddata);eigvalue_PCA = diag(eigvalue_PCA);clear ddata;maxEigValue = max(eigvalue_PCA);eigIdx = find(eigvalue_PCA/maxEigValue < 1e-12);eigvalue_PCA(eigIdx) = [];eigvector(:,eigIdx) = [];[junk, index] = sort(-eigvalue_PCA);eigvalue_PCA = eigvalue_PCA(index);eigvector = eigvector(:, index);%=======================================if options.PCARatio > 1idx = options.PCARatio;if idx < length(eigvalue_PCA)eigvalue_PCA = eigvalue_PCA(1:idx);eigvector = eigvector(:,1:idx);endelseif options.PCARatio < 1sumEig = sum(eigvalue_PCA);sumEig = sumEig*options.PCARatio;sumNow = 0;for idx = 1:length(eigvalue_PCA)sumNow = sumNow + eigvalue_PCA(idx);if sumNow >= sumEigbreak;endendeigvalue_PCA = eigvalue_PCA(1:idx);eigvector = eigvector(:,1:idx);end%=======================================eigvalue_PCA = eigvalue_PCA.^-.5;eigvector_PCA = (data'*eigvector).*repmat(eigvalue_PCA',nFea,1); data = eigvector;clear eigvector;endelseif ~bCholDPrime = data'*data;% options.ReguAlpha = nSmp*options.ReguAlpha;switch lower(options.ReguType)case {lower('Ridge')}for i=1:size(DPrime,1)DPrime(i,i) = DPrime(i,i) + options.ReguAlpha;endcase {lower('Tensor')}DPrime = DPrime +options.ReguAlpha*options.regularizerR;case {lower('Custom')}DPrime = DPrime +options.ReguAlpha*options.regularizerR;otherwiseerror('ReguType does not exist!');endDPrime = max(DPrime,DPrime');endend[nSmp,nFea] = size(data);Hb = zeros(nClass,nFea);for i = 1:nClass,index = find(gnd==classLabel(i));classMean = mean(data(index,:),1);Hb (i,:) = sqrt(length(index))*classMean;endelapse.timeW = 0;elapse.timePCA = cputime - tmp_T;tmp_T = cputime;if bPCA[dumpVec,eigvalue,eigvector] = svd(Hb,'econ');eigvalue = diag(eigvalue);eigIdx = find(eigvalue < 1e-3);eigvalue(eigIdx) = [];eigvector(:,eigIdx) = [];eigvalue = eigvalue.^2;eigvector =eigvector_PCA*(repmat(eigvalue_PCA,1,length(eigvalue)).*eigvector);elseWPrime = Hb'*Hb;WPrime = max(WPrime,WPrime');dimMatrix = size(WPrime,2);if Dim > dimMatrixDim = dimMatrix;endif isfield(options,'bEigs')if options.bEigsbEigs = 1;elsebEigs = 0;endelseif (dimMatrix > 1000 & Dim < dimMatrix/10) | (dimMatrix > 500 & Dim < dimMatrix/20) | (dimMatrix > 250 & Dim < dimMatrix/30)bEigs = 1;elsebEigs = 0;endendif bEigs%disp('use eigs to speed up!');option = struct('disp',0);if bCholoption.cholB = 1;[eigvector, eigvalue] = eigs(WPrime,R,Dim,'la',option);else[eigvector, eigvalue] = eigs(WPrime,DPrime,Dim,'la',option);endeigvalue = diag(eigvalue);else[eigvector, eigvalue] = eig(WPrime,DPrime);eigvalue = diag(eigvalue);[junk, index] = sort(-eigvalue);eigvalue = eigvalue(index);eigvector = eigvector(:,index);if Dim < size(eigvector,2)eigvector = eigvector(:, 1:Dim);eigvalue = eigvalue(1:Dim);endendendfor i = 1:size(eigvector,2)eigvector(:,i) = eigvector(:,i)./norm(eigvector(:,i)); endelapse.timeMethod = cputime - tmp_T;elapse.timeAll = elapse.timePCA + elapse.timeMethod;。
人脸识别核心算法及MATLAB代码

人脸识别核心算法在检测到人脸并定位面部关键特征点之后,主要的人脸区域就可以被裁剪出来,经过预处理之后,馈入后端的识别算法。
识别算法要完成人脸特征的提取,并与库存的已知人脸进行比对,完成最终的分类。
我们在这方面的主要工作包括:∙基于LGBP的人脸识别方法问题:统计学习目前已经成为人脸识别领域的主流方法,但实践表明,基于统计学习的方法往往会存在“推广能力弱”的问题,尤其在待识别图像“属性”未知的情况下,更难以确定采用什么样的训练图像来训练人脸模型。
鉴于此,在对统计学习方法进行研究的同时,我们还考虑了非统计模式识别的一类方法。
思路:对于给定的人脸图像,LGBP方法首先将其与多个不同尺度和方向的Gabor滤波器卷积(卷积结果称为Gabor特征图谱)获得多分辨率的变换图像。
然后将每个Gabor特征图谱划分成若干互不相交的局部空间区域,对每个区域提取局部邻域像素的亮度变化模式,并在每个局部空间区域内提取这些变化模式的空间区域直方图,所有Gabor特征图谱的、所有区域的直方图串接为一高维特征直方图来编码人脸图像。
并通过直方图之间的相似度匹配技术(如直方图交运算)来实现最终的人脸识别。
在FERET四个人脸图像测试集合上与FERET97的结果对比情况见下表。
由此可见,该方法具有良好的识别性能。
而且LGBP方法具有计算速度快、无需大样本学习、推广能力强的优点。
参见ICCV2005表.LGBP方法与FERET'97最佳结果的对比情况∙基于AdaBoost的Gabor特征选择及判别分析方法问题:人脸描述是人脸识别的核心问题之一,人脸识别的研究实践表明:在人脸三维形状信息难以准确获取的条件下,从图像数据中提取多方向、多尺度的Gabor特征是一种合适的选择。
使用Gabor特征进行人脸识别的典型方法包括弹性图匹配方法(EGM)和Gabor特征判别分类法(GFC)。
EGM在实用中需要解决关键特征点的定位问题,而且其速度也很难提高;而GFC则直接对下采样的Gabor特征用PCA降维并进行判别分析,尽管这避免了精确定位关键特征点的难题,但下采样的特征维数仍然偏高,而且简单的下采样策略很可能遗漏了非常多的有用特征。
matlab pca函数详解 -回复

matlab pca函数详解-回复PCA (Principal Component Analysis)是一种常用的降维技术,它通过线性变换将原始数据转换为一组新的无关变量,称为主成分。
本文将详细介绍Matlab中的PCA函数,并逐步解释其使用方法和原理。
一、PCA函数介绍在Matlab中,pca函数用于执行PCA操作。
其语法如下:[coeff,score,latent,tsquared,explained,mu] = pca(X)其中,X表示输入的数据矩阵。
接下来,让我们逐个解释每个输出变量的含义和用法。
1. coeff:主成分系数矩阵coeff是一个大小为[p,p]的矩阵,其中p是原始数据矩阵X的列数。
每一列是一个主成分向量,按照特征值降序排列。
通过将数据投影到主成分系数矩阵的列向量上,可以得到降维后的数据。
2. score:主成分得分矩阵score是一个大小为[n,p]的矩阵,其中n是原始数据矩阵X的行数。
它表示每个样本在每个主成分上的得分。
得分可以用于可视化和分类等任务。
3. latent:主成分的特征值向量latent是一个长度为p的向量,其中存储了每个主成分的特征值。
特征值可以用来评估每个主成分的重要性。
4. tsquared:每个样本的Hotelling T平方统计量tsquared是一个大小为[n,1]的矩阵,其中存储了每个样本在投影空间中的Hotelling T平方统计量。
该统计量可以用于检测异常值。
5. explained:方差解释百分比向量explained是一个长度为p的向量,其中存储了每个主成分解释的方差百分比。
它可以帮助我们选择保留多少主成分。
通常,我们选择解释方差百分比大于某个阈值的主成分。
6. mu:每个特征的均值向量mu是一个长度为p的向量,其中存储了每个特征的均值。
在PCA执行之前,数据会被减去均值,以确保每个特征的均值为零。
二、使用PCA函数进行降维现在,我们将在一个实例数据集上使用PCA函数进行降维,并逐步解释每个步骤的细节。
Matlab在视频人脸检测与人脸识别中的应用技巧

Matlab在视频人脸检测与人脸识别中的应用技巧人脸检测和人脸识别是计算机视觉领域中的重要研究方向,近年来得到了广泛的应用。
在视频处理中,人脸的准确检测和识别是实现许多高级应用的基础。
Matlab作为一种功能强大的数学建模与仿真软件,提供了丰富的图像处理工具箱,使得人脸检测与识别算法的实现变得简单与高效。
一、图像预处理在进行人脸检测与识别之前,通常需要对图像进行预处理,以提高算法的准确性。
图像预处理的过程包括灰度化、直方图均衡化、尺寸归一化等。
利用Matlab的图像处理工具箱,可以快速实现这些预处理操作。
1.1 灰度化灰度化是将彩色图像转换为灰度图像的过程,将去除色彩信息,使图像变得更易处理。
在Matlab中,使用rgb2gray函数可以方便地将彩色图像转换为灰度图像。
1.2 直方图均衡化直方图均衡化是一种增强图像对比度的方法,通过对图像的灰度直方图进行变换来实现。
在Matlab中,使用histeq函数可以对图像的灰度直方图进行均衡化操作,提高图像的细节显示能力。
1.3 尺寸归一化不同的人脸图像具有不同的尺寸和角度,这对人脸检测与识别算法会造成影响。
为了提高算法的鲁棒性,通常需要将人脸图像进行尺寸归一化处理。
在Matlab中,可以使用imresize函数将图像进行缩放,使得人脸图像具有相同的尺寸。
二、人脸检测人脸检测是指在一幅图像中自动识别和定位人脸的过程,是人脸识别的首要步骤。
Matlab提供了多种人脸检测算法的实现,其中常用的有Haar特征分类器和基于深度学习的卷积神经网络(CNN)。
2.1 Haar特征分类器Haar特征分类器是一种基于机器学习的人脸检测算法,可以通过训练集的正负样本学习出人脸的特征。
在Matlab中,可以使用vision.CascadeObjectDetector对象和trainCascadeObjectDetector函数来实现Haar特征分类器的训练与检测。
2.2 基于深度学习的卷积神经网络(CNN)近年来,深度学习在图像处理领域取得了巨大的突破,其中卷积神经网络是一种非常有效的人脸检测方法。
人脸识别PCA算法matlab实现和详细步骤讲解

人脸识别% FaceRec.m% PCA 人脸识别修订版,识别率88%% calc xmean,sigma and its eigen decompositionallsamples=[];%所有训练图像for i=1:40for j=1:5a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg'));% imshow(a);b=a(1:112*92); % b 是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右b=double(b);allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M=200endendsamplemean=mean(allsamples); % 平均图片,1 × Nfor i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M × N 矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片”end;% 获取特征值及特征向量sigma=xmean*xmean'; % M * M 阶矩阵[v d]=eig(sigma);d1=diag(d);% 按特征值大小以降序排列dsort = flipud(d1);vsort = fliplr(v);%以下选择90%的能量dsum = sum(dsort);dsum_extract = 0;p = 0;while( dsum_extract/dsum < 0.9)p = p + 1;dsum_extract = sum(dsort(1:p));endi=1;% (训练阶段)计算特征脸形成的坐标系base = xmean' * vsort(:,1:p) * diag(dsort(1:p).^(-1/2));% base 是N×p 阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1)% 详见《基于PCA 的人脸识别算法研究》p31% xmean' * vsort(:,i)是小矩阵的特征向量向大矩阵特征向量转换的过程%while (i<=p && dsort(i)>0)% base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base 是N×p 阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1)% 详见《基于PCA 的人脸识别算法研究》p31% i = i + 1; % xmean' * vsort(:,i)是小矩阵的特征向量向大矩阵特征向量转换的过程%end% 以下两行add by gongxun 将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor allcoor = allsamples * base; % allcoor 里面是每张训练人脸图片在M*p 子空间中的一个点,即在子空间中的组合系数,accu = 0; % 下面的人脸识别过程中就是利用这些组合系数来进行识别% 测试过程for i=1:40for j=6:10 %读入40 x 5 副测试图像a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg'));b=a(1:10304);b=double(b);tcoor= b * base; %计算坐标,是1×p 阶矩阵for k=1:200mdist(k)=norm(tcoor-allcoor(k,:));end;%三阶近邻[dist,index2]=sort(mdist);class1=floor( (index2(1)-1)/5 )+1;class2=floor((index2(2)-1)/5)+1;class3=floor((index2(3)-1)/5)+1;if class1~=class2 && class2~=class3class=class1;elseif class1==class2class=class1;elseif class2==class3class=class2;end;if class==iaccu=accu+1;end;end;end;accuracy=accu/200 %输出识别率特征人脸% eigface.mfunction [] = eigface()% calc xmean,sigma and its eigen decompositionallsamples=[];%所有训练图像for i=1:40for j=1:5a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg'));% imshow(a);b=a(1:112*92); % b 是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右b=double(b);allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M=200endendsamplemean=mean(allsamples); % 平均图片,1 × Nfor i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M × N 矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片”end;% 获取特征值及特征向量sigma=xmean*xmean'; % M * M 阶矩阵[v d]=eig(sigma);d1=diag(d);% 按特征值大小以降序排列dsort = flipud(d1);vsort = fliplr(v);%以下选择90%的能量dsum = sum(dsort);dsum_extract = 0;p = 0;while( dsum_extract/dsum < 0.9)p = p + 1;dsum_extract = sum(dsort(1:p));endp = 199;% (训练阶段)计算特征脸形成的坐标系%while (i<=p && dsort(i)>0)% base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base 是N×p 阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA 的人脸识别算法研究》p31% i = i + 1; % xmean' * vsort(:,i)是小矩阵的特征向量向大矩阵特征向量转换的过程%endbase = xmean' * vsort(:,1:p) * diag(dsort(1:p).^(-1/2));% 生成特征脸for (k=1:p),temp = reshape(base(:,k), 112,92);newpath = ['d:\test\' int2str(k) '.jpg'];imwrite(mat2gray(temp), newpath);endavg = reshape(samplemean, 112,92);imwrite(mat2gray(avg), 'd:\test\average.jpg');% 将模型保存save('e:\ORL\model.mat', 'base', 'samplemean');人脸重建% Reconstruct.mfunction [] = reconstruct()load e:\ORL\model.mat;% 计算新图片在特征子空间中的系数img = 'D:\test2\10.jpg'a=imread(img);b=a(1:112*92); % b 是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右b=double(b);b=b-samplemean;c = b * base; % c 是图片a 在子空间中的系数, 是1*p 行矢量% 根据特征系数及特征脸重建图% 前15 个t = 15;temp = base(:,1:t) * c(1:t)';temp = temp + samplemean';imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t1.jpg'); % 前50 个t = 50;temp = base(:,1:t) * c(1:t)';temp = temp + samplemean';imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t2.jpg'); % 前100 个t = 100;temp = base(:,1:t) * c(1:t)';temp = temp + samplemean';imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t3.jpg'); % 前150 个t = 150;temp = base(:,1:t) * c(1:t)';temp = temp + samplemean';imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t4.jpg'); % 前199 个t = 199;temp = base(:,1:t) * c(1:t)';temp = temp + samplemean';imwrite(mat2gray(reshape(temp, 112,92)),'d:\test2\t5.jpg');基于2DPCA与(2D)2PCA的人脸识别(第二版)。
PCA用于人脸特征提取及Matlab实现

随机过程PCA用于人脸识别附Matlab代码于琦2011/10/27学号:2009011149【摘要】人脸识别技术是近来非常活跃的研究领域,它综合多学科知识,且应用非常广泛。
采用主元分析法(PCA)进行人脸识别的经典方法之一。
本文利用Matlab在ORL人脸库上实现PCA初步人脸识别,包括图像特征提取、人脸重构与识别方法设计。
讨论了用奇异值分解等方法简化特征向量求解,并详细阐述其在Matlab中的实现过程。
结合ORL人脸库自身特点,通过对特征值和特征脸的分析进行合理取舍,提高了识别率。
【介绍】“人脸识别是一项热门的计算机技术研究领域,它属于生物特征识别技术,是对生物体(一般特指人)本身的生物特征来区分生物体个体。
更好的解决该问题将有助于身份确认和身份查找等应用、促进众多学科的发展。
”“目前,人脸识别的方法可以分为5类,分别为基于特征脸(PCA)的人脸识别方法,神经网络的人脸识别方法,弹性图匹配的人脸识别方法,线段Hausdorff 距离(LHD) 的人脸识别方法支持向量机(SVM) 的人脸识别方法。
其中给予特征脸的人脸识别是传统方法,基于K-L 变换(PCA)的人脸识别方法又叫特征脸方法、本征脸方法(Eigenface),最早由Turk 和Pentland 提出。
它有均方误差最小,降维减少计算量,主分量特性稳定等优点。
”“由于PCA较之于前几种方法相对简单,故本文对PCA算法进行研究并用Matlab 给出实现。
”“本文的结构安排如下:第二章模型(Model)及基本理论和方法(Basic Theory and Method),第三章方法(Method)及方法分析(Analysis of Method),第四章算法(Algorithm)及算法分析(Analysis of Algorithm),第五章数值结果及讨论(Discussion),第六章结论(Conclusion)。
第二章模型及基本理论和方法采用PCA对原始数据的处理,通常有三个方面的作用—降维、相关性去除、概率估计。
ICA人脸识别算法实例matlab源码

% 将其组成矩阵
S=[I1;I2;I3]; % 图片个数即为变量数,图片的像素数即为采样数
% 因此S_all是一个变量个数*采样个数的矩阵
b=((1-u)*t'*g*b+u*X*g)/SampleNum-mean(dg)*b;
% 核心公式,参见理论部分公式2.52
b=b-B*B'*b; % 对b正交化
%%%%%%%%%%%%%%%%%%%%%%%%%% 初始化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc%%%%%%%%%%% 读入原始图像,混合,并输出混合图像 %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% PCA计算并构图 %%%%%%%%%%%%%%%%%%%%%%%%
[V,D]=eig(MixedS_cov);
Vtmp=zeros(size(V,1),1);
for j=1:2
for i=1:2
if D(i,i)
X=MixedS_white; % 以下算法将对X进行操作
[VariableNum,SampleNum]=size(X);
numofIC=VariableNum; % 在此应用中,独立元个数等于变量个数
Sweight=randn(size(S,1)); % 取一随机矩阵,作为信号混合的权矩阵
MixedS=Sweight*S; % 得到三个混合信号矩阵
% 将混合矩阵重新排列并输出
subplot(4,3,4),plot(MixedS(1,:)),title('混合信号1'),
Matlab中的人脸识别与人脸特征提取

Matlab中的人脸识别与人脸特征提取近年来,随着计算机技术的快速发展和应用的普及,人脸识别技术逐渐进入了我们的生活。
无论是在安全领域的门禁系统、身份验证应用,还是在娱乐领域的人脸美化软件,人脸识别都发挥着重要的作用。
而在人脸识别技术的实现中,人脸特征提取是一个关键的环节。
本文将介绍在Matlab中实现人脸识别和人脸特征提取的方法与技巧。
在Matlab中,有许多经典的人脸识别算法可供选择,其中最为常见且被广泛应用的是基于主成分分析(PCA)的人脸识别算法。
PCA是一种经典的降维算法,它通过线性变换将高维数据映射到低维空间中,从而捕捉数据的主要特征。
在人脸识别中,我们可以将每张人脸的像素矩阵视为一个高维数据向量,利用PCA算法将其映射到一个低维特征空间中。
在特征空间中,每张人脸都可以表示为一个特征向量,就像每个人都有自己独特的“人脸特征码”一样。
要在Matlab中实现基于PCA的人脸识别,首先需要收集一组包含多个人脸的图像数据集作为训练样本。
然后,将每个人脸的像素矩阵展开成一个列向量,并将这些列向量按列排成一个矩阵,构成一个大的数据矩阵。
接下来,通过对数据矩阵进行协方差矩阵分解和特征值分解,可以得到一组特征向量。
这些特征向量被称为“特征脸”,它们是训练样本中人脸数据的主要变化方向。
最后,通过计算待识别人脸与训练样本中每个人脸的特征向量的距离,并找出距离最小的特征向量所对应的人脸,即可完成人脸识别的过程。
除了PCA算法,还有其他一些在Matlab中常用的人脸识别算法,如线性判别分析(LDA)算法、小波变换、局部二值模式(LBP)等。
这些算法在原理和实现上各有特点,可以根据实际需求选择合适的算法进行人脸识别。
在人脸识别之前,首先需要对输入的人脸图像进行预处理。
通常的预处理步骤包括灰度化、直方图均衡化和人脸检测。
灰度化是将彩色图像转换为灰度图像,降低了计算复杂度,同时保留了图像的关键信息。
直方图均衡化可以增强图像的对比度,使得人脸特征更加明显。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB下人脸图像的PCA重构matlab代码
主函数
clc;
clear all;
newimage=double(zeros(112*6,92*5));
[M,sort_V,avg_face] = averageface( );%返回去均值的矩阵和协方差,以及排列好的特征向量
k=1;
new_sort_V =sort_V(1:10304,1:30);%取特征向量的前30个,并进行显示for i=1:112:5*112+1
for j=1:92:4*92+1
newimage(i:i+111,j:j+91)=reshape(new_sort_V(:,k),112,92);
k=k+1;
end
end
minum=min(min(newimage));%对特征向量进行标定
maxum=max(max(newimage));
d=maxum-minum;
newimage(:,:)=newimage(:,:)-minum;
newimage(:,:)=newimage(:,:)/d;
newimage(:,:)=newimage(:,:)*255;
newimage=uint8(newimage);
subplot(1,3,1);
title('特征向量图');
imshow(newimage);%显示前30个特征向量
avg_face=uint8(avg_face);
subplot(1,3,2)
title('平均脸');
imshow(avg_face);
subplot(1,3,3)
[ tyxs,re_newimage] = touyingxishu( sort_V ,avg_face);
imshow(re_newimage);
子函数
function []=img2txt()
maindir = 'D:\Image';
subdir = dir( maindir ); % 先确定子文件夹
m=1;
k=1;
for i = 1 : length( subdir )
if( isequal( subdir( i ).name, '.') || isequal( subdir( i ).name, '..') || ~subdir( i ).isdir ) % 如果不是目录跳过
continue;
end
subdirpath = fullfile( maindir, subdir( i ).name, '*.pgm' );
images = dir( subdirpath ); % 在这个子文件夹下找后缀为pgm的文件
% 遍历每张图片
for j = 1 : length( images )
imagepath = fullfile( maindir, subdir( i ).name,
images( j ).name );
imgdata = imread( imagepath ); % 这里进行你的读取操作
[row, col]=size(imgdata); %将数据写入txt中
fid = fopen(['C:\Users\Administrator\Desktop\编程实验材料\att_faces','\s',int2str(m),'\',int2str(k),'.txt'],'w'); %新建
txt文件存储图像的坐标和灰度值
for I=1:row
for J=1:col
fprintf(fid,'%03d\t',imgdata(I,J));
end
fprintf(fid,'\n') ;
end
fclose(fid);
k=k+1;
end
m=m+1;
k=1;
end
function [M,sort_V,avg_face] = averageface()
big_array=double(zeros(10304,400));
new_big_array=double(zeros(10304,400));
avg_face=double(zeros(112,92));
i=1;
for m=1:40;
for k=1:10
FileName = ['C:\Users\Administrator\Desktop\编程实验材料
\att_faces','\s',int2str(m),'\',int2str(k),'.txt'];
p = load (FileName);
big_array(:,i)=reshape(p,10304,1); %将400张脸转换成10304*400的大矩阵
new_p=reshape(p,112,92);
avg_face(:,:)=avg_face(:,:)+new_p(:,:)/400; %求平均脸
i=i+1;
end
end
M=mean(big_array); %对矩阵的每一列求均值
for i=1:400
new_big_array(:,i)=big_array(:,i)-M(i);%去均值后的矩阵
end
%用SVD求特征向量
C0=new_big_array'*new_big_array;%求低维度的协方差
[V0,~]=eig(C0);
k=0;
V=new_big_array*V0;%特征向量
for i=1:400 %将特征向量进行归一化10304*400
for j=1:10304
k=k+V(j,i)^2;
end
k=k^(0.5);
V(1:10304,i)= V(1:10304,i)/k;
k=0;
end
sort_V=double(zeros(10304,400));
k=400;
for i=1:400 %将特征向量的列按特征值从大到小排列好
sort_V(1:10304,i)=V(1:10304,k);
k=k-1;
end
function [ tyxs,re_newimage] = touyingxishu( sort_V ,avg_face)
FileName = ['C:\Users\Administrator\Desktop\编程实验材料
\att_faces','\s',int2str(1),'\',int2str(1),'.txt'];
p = load (FileName);
avg_face=double(avg_face);
big_array=reshape(p,1,10304);
a_big_array=double(reshape(big_array,112,92));
big_array=a_big_array(:,:)-avg_face(:,:);
big_array=reshape(big_array,1,10304);
tyxs=big_array*sort_V;
re_newimage=double(zeros(10304,1));
for i=1:400
re_newimage(:,:)= re_newimage(:,:)+tyxs(i)*sort_V(1:10304,i);
end
re_newimage= reshape(re_newimage,112,92);
re_newimage=re_newimage(:,:)+avg_face(:,:);
minum=min(min(re_newimage));%对特征向量进行标定
maxum=max(max(re_newimage));
d=maxum-minum;
re_newimage(:,:)=re_newimage(:,:)-minum;
re_newimage(:,:)=re_newimage(:,:)/d;
re_newimage(:,:)=re_newimage(:,:)*255;
re_newimage=uint8(re_newimage);
end。