|
PCA主成分分析---降维处理
(1)设图像有100张,每张图像为16*16大小的灰度图,转化为一维向量就是 256 x 100矩阵 A,每一列为一个图像向量;
(2)计算256x100矩阵A的平均值,得到256x1的一维向量B;
(3)256 x 100矩阵A 每一列减去 B,得到256 x 100矩阵C;
(4)求解256 x 100矩阵 C 的协方差矩阵D, D = C'*C;得到 100 x 100 矩阵D;
(5)求解矩阵D的特征值和特征向量,取前K个最大的特征值,以及 前K个最大的特征值对应的特征向量,组合得到 100 x K 的特征矩阵E;
(6)采用 A * 特征矩阵E 得到降维的特征向量矩阵256 x K,即特征向量空间F。
(7)求解矩阵C的转置C',采用 C' * 特征向量空间 F 得到降维的特征矩阵G = 100xK,则100个人,每个人256个特征降维到 每个人K个特征。
- function [m, A, Eigenfaces] = EigenfaceCore(T)
- % 使用PCA分析人脸图像之间的差异特征
- % 该函数将得到一个包含所有的训练样本图像向量的2D矩阵,将返回由训练样本中提取得到的三个输出。
- % 输入: T --- 一个包含1D图像向量的2D矩阵,假设所有的P张标准图像尺寸大小相同MxN. 因此
- % 1D列向量的长度均是是MxN,因此T是M*NxP 2D矩阵。
- % 输出: m - (M*Nx1) 训练样本数据库的平均值
- % Eigenfaces - (M*Nx(P-1)) 训练样本数据库本征向量(Eigen vectors)的协方差矩阵
- % A - (M*NxP) 所有的图像向量矩阵Matrix of centered image vectors
- % 求样本图像的平均向量
- m = mean(T,2); % 计算图像平均值,m = (1/P)*sum(Tj's) (j = 1 : P)--列平均,
- % T中一列是一幅图像1D数据,对每一行求平均
- Train_Number = size(T,2);
- % 计算每个样本与平均向量的差向量
- A = [];
- for i = 1 : Train_Number
- temp = double(T(:,i)) - m; % 由Ai = Ti - m计算每幅图像的差值,列向量相减
- A = [A temp]; % 汇总所有的样本图像数据
- end
- % 本征图像识别方法
- % 根据线性代数理论,一个PxQ矩阵,非零特征值的最大个数是矩阵的(P-1,Q-1)的较小值。
- % 因为(P)训练样本数量通常小于(M*N),大多数非零特征值数量等于P-1,因此我们可以通过
- % 计算A'*A (一个PxP矩阵) 代替计算A*A' (一个M*NxM*N矩阵)。可看出A*A'的维数明显
- % 大于A'*A的维数,以此达到降维的目的。
- L = A'*A; % 计算协方差矩阵
- [V D] = eig(L); % 求特征向量V 和 特征值 D
- % 矩阵L的所有的特征值被分类,去掉小于具体的阈值的特征值,因此非零特征值的数量也许低于P-1
- % 按照特征值 > 1来取特征向量
- L_eig_vec = [];
- for i = 1 : size(V,2)
- if( D(i,i)>1 ) % 特征值大于1
- L_eig_vec = [L_eig_vec V(:,i)];
- end
- end
- % 协方差C的特征向量(所谓的"Eigenfaces")
- % 降维
- Eigenfaces = A * L_eig_vec;
复制代码 测试图像函数:
- function Recognized_index = Face_Recognition(TestImage, m, A, Eigenfaces)
- % 识别步骤....
- % 计算两脸欧氏距离匹配人脸
- % 输入: TestImage - 测试样本路径中的测试样本
- % m - (M*Nx1) 训练样本的行平均值,EigenfaceCore' 函数的输出变量 .
- % Eigenfaces - (M*Nx(P-1)) 训练样本数据库的协方差矩阵的特征向量, EigenfaceCore' 函数的输出变量
- % A - (M*NxP) 所有均值差后的图像数据集合, EigenfaceCore' 函数的输出变量.
- % 输出: OutputName - 输出训练样本库中的识别出的图像名字.
- % 投影A到人脸空间中,利用Eigenface的转置矩阵Eigenface'*A得到相应的特征向量
- ProjectedImages = [];
- Train_Number = size(Eigenfaces,2);
- for i = 1 : Train_Number
- temp = Eigenfaces'*A(:,i); % 将每个样本投影到特征空间
- ProjectedImages = [ProjectedImages temp];
- end
- % 从测试图像中提取PCA特征
- if size(TestImage,3)>1
- temp = rgb2gray(TestImage);
- else
- temp = TestImage;
- end
- [irow,icol] = size(temp);
- InImage = reshape(temp',irow*icol,1);
- Difference = double(InImage)-m; % 测试样本与训练样本均值差
- ProjectedTestImage = Eigenfaces'*Difference; % 将待测样本投影到特征空间
- % 按照欧式距离取最小的原则得出匹配的人脸
- Euc_dist = []; temp=[];
- for i = 1 : Train_Number
- q = ProjectedImages(:,i);
- temp = ( norm( ProjectedTestImage - q ) )^2;
- Euc_dist = [Euc_dist,temp];
- end
- [Euc_dist_min , Recognized_index] = min(Euc_dist);
复制代码 百度网盘完整代码分享:http://pan.baidu.com/s/1nuAZbU5
PS:
简洁干练的代码:- function [feature_down, mean_image, E_vector]= PCA(features)
- % feature_cell:输入的特征
- % feature_down:降维后的特征
- mean_image = mean( features );
- features_center = features - ones(size(features,1), 1) * mean_image;
- feature_cov = features_center * features_center'; % 协方差矩阵 feature_cov = 样本x样本的方阵
- [V, D] = eig(feature_cov); % 求特征向量V 和 特征值 D
- K = 19; % K个最大的特征值
- E = V( :, end-K+1:end ); % 特征矩阵
- E_vector = features_center'*E; % 特征向量空间
- feature_down = features_center * E_vector; % 降维
复制代码 %% PCA降维
[feature_train, mean_image, E_vector]= PCA(train_ims_HoG);
test_ims_HoG_center = test_ims_HoG - ones(size(test_ims_HoG,1), 1) * mean_image;
feature_test = test_ims_HoG_center * E_vector; % 降维
|
|