发布时间 : 星期一 文章模式识别方法二实验报告更新完毕开始阅读4b3044c42cc58bd63186bd5e
for i = 1 : Train_Number
str = int2str(i);%把文件索引转换为字符串格式 str = strcat('\\',str,'.pgm'); str = strcat(TrainDatabasePath,str); img = imread(str); [irow icol] = size(img);
temp = reshape(img',irow*icol,1); T = [T temp]; end
T = double(T);
2、第二部分:FisherfaceCore
function [m_database V_PCA V_Fisher ProjectedImages_Fisher Class_number Class_population] = FisherfaceCore(T) %%%%%%%%返回值注释%%%%%%%%%%%
%m_database --- (M*Nx1)维的训练样本均值
%V_PCA --- (M*Nx(P-C)训练样本协方差的特征向量
%V_Fisher --- ((P-C)x(C-1)) 最大的(C-1)维J = inv(Sw) * Sb的特征矩阵 %ProjectedImages_Fisher --- ((C-1)xP)维训练样本,这些样本从fisher线性空间中提取
%%%%%基本量赋值 %%%%%%%%%
Class_number=(size(T,2))/9; 类的数目,除以8取决于样本中有多少类人 Class_population = 9;%每一类的图像数目
P = Class_population * Class_number; %总训练样本的数目 %%%%%计算均值%%%%%
m_database = mean(T,2);%°包含T每一行均值的列向量 %%%%计算方差%%%%%
A = T - repmat(m_database,1,P); %%%%%计算特征脸的算法%%%%%% L = A' * A; [V D] = eig(L); V = fliplr(V);
%%%%筛选小的特征值%%%%% L_eig_vec = []; dig = fliplr(max(D)); for i = 1 : Class_number
L_eig_vec = [L_eig_vec V(:,i)/sqrt(dig(i))]; end
%%%%计算特征矩阵的协方差矩阵C%%%%%
V_PCA = A * L_eig_vec;%V_PCA就是降维后的协方差矩阵 ProjectedImages_PCA = []; for i = 1 : P
temp = V_PCA'*A(:,i);
ProjectedImages_PCA = [ProjectedImages_PCA temp];
end
%%%%%fisher分类器的设计方法%%%%
%%%%%计算在特征空间里面每一个类的均值%%%%%
m_PCA = mean(ProjectedImages_PCA,2) %特征空间总的均值 m = zeros( Class_number, Class_number ); Sw = zeros( Class_number, Class_number); Sb = zeros( Class_number, Class_number);
for i = 1 : Class_number m(:,i) =
mean( ( ProjectedImages_PCA(:,((i-1)*Class_population+1):i*Class_population) ), 2 )'; %每一类的样本分别求均值 S = zeros(Class_number, Class_number);
for j = ((i-1) * Class_population + 1) : ( i*Class_population ) S = S + ( ProjectedImages_PCA(:,j) - m(:,i)) * (ProjectedImages_PCA(:,j) - m(:,i))'; end
Sw = Sw + S;
Sb = Sb + (m(:,i) - m_PCA) * (m(:,i) - m_PCA)' end
%%%%%%?计算fisher判别准则,目标是获取最大类间离散度和最小类内离散度%%%%%% %%%%%%?ò??μ???±êê?£o??è?×?′óàà??à?é¢?èoí×?D?μ?àà?úà?é¢?è?£ [J_eig_vec, J_eig_val] = eig(Sb,Sw); J_eig_val = max(J_eig_val); J_eig_vec = fliplr(J_eig_vec);
%%%%%%去除0特征根和排序 for i = 1 : Class_number - 1
V_Fisher(:,i) = J_eig_vec(:,i);%fisher判别法将N维映射到C-1维 end
%%%%%从fisher线性空间中提取图像%
Yi = V_Fisher' * V_PCA' * (Ti - m_database) for i = 1: Class_number * Class_population
ProjectedImages_Fisher(:,i) = V_Fisher' * ProjectedImages_PCA(:,i); end%由PCA过渡到FLD
%img_fisher = w_fisher' * pca_img;
%ProjectedImages_Fisher = V_Fisher' * ProjectedImages_PCA;
3、第三部分:Recognition.m
function OutputName = Recognition(TestImage, m_database, V_PCA, V_Fisher,
ProjectedImages_Fisher, Class_number, Class_population) %函数描述:这个函数将源图像提取成特征脸,然后比较它们之间的欧几里得距离 %输入量: TestImage ---测试样本的路径
%%V_PCA --- (M*Nx(P-C)训练样本协方差的特征向量
%V_Fisher --- ((P-C)x(C-1)) 最大的(C-1)维J = inv(Sw) * Sb的特征矩阵 %ProjectedImages_Fisher --- ((C-1)xP)维训练样本,这些样本从fisher线性空间中提取
%Class_number---类的数目
%Class_population---每一类图像的数目
%返回值: OutputName ---在训练样本中的被识别的图像的名字
Train_Number = size(ProjectedImages_Fisher,2);
%%%%%%%%%%%%%%%%%%%%%%%%从测试样本中提取PCA特征%%%%%%%%%%%%%%%%%%% InputImage = imread(TestImage); temp = InputImage(:,:,1);
[irow icol] = size(temp);
InImage = reshape(temp',irow*icol,1); Difference = double(InImage)-m_database;
ProjectedTestImage = V_Fisher' * V_PCA' * Difference; %%%%%%%%%%%%%%%%%%%%%%%%计算欧几里得几何距离%%%%%%%%%%%%%%%% Euc_dist = [];
for i = 1 : Train_Number
q = ProjectedImages_Fisher(:,i);
temp = ( norm( ProjectedTestImage - q ))^2 ; Euc_dist = [Euc_dist temp]; end
Euc_dist2 = []; for i=1 : Class_number dist =
mean(Euc_dist(((i-1)*Class_population+1):(i*Class_population))); Euc_dist2 = [Euc_dist2 dist]; end
[Euc_dist_min ,Recognized_index] = min(Euc_dist2);
Recognized_index = (Recognized_index - 1) * Class_population + 1; OutputName = strcat(int2str(Recognized_index),'.pgm');