模式识别方法二实验报告 联系客服

发布时间 : 星期一 文章模式识别方法二实验报告更新完毕开始阅读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');