📄 fld_xiugai.m
字号:
clear
allsamples=[];
Sw = []; %类内散度矩阵
Sb = []; %类间散度矩阵
q=60; %选取的特征向量的维数
n = 3 ; %每个类别的样本数目
tic
for i=1:100 %读入训练样本
for j=[1 2 3]
a=imread(strcat('E:\王选\palmprint_database\palmprint_database\P_',num2str(i),'_',num2str(j),'.bmp'));
a=histeq(a); %直方图均衡化
a=double(a);
% [CA,CH,CV,CD] = dwt2(a,'db4');
% [CA1,CH1,CV1,CD1] = dwt2(CA,'db4');
% a=log10(a+1); %进行对数变换
b=a(1:128*128);
% b=CA1(1:37*37);
allsamples=[allsamples;b];%生成行向量
end
end
xunlian = zeros(100,128*128); %计算各类的均值
% xunlian = zeros(100,37*37);
for i = 1:n:(100*(n-1)+1)
for j = 0:(n-1)
xunlian((i-1)/n+1,:) = (xunlian((i-1)/n+1,:) + allsamples(i+j,:));
end
end
xunlian =1/n * xunlian;
% Sw = allsamples;
% for i = 1:n:(100*(n-1)+1) %计算类内散度矩阵为Sw'*Sw
% for j = 0:(n-1)
% Sw((i+j),:) = Sw((i+j),:) - xunlian((i-1)/n+1,:);
% end
% end
samplemean=mean(allsamples);
for i = 1:100 %计算雷间散度矩阵为Sb'*Sb
xunlian(i,:) =xunlian(i,:) - samplemean;
end
Sb =xunlian;
Sb = Sb * n;
for i=1:100*n %对训练样本归一化
allsamples(i,:) = allsamples(i,:)-samplemean;
end;
%xmean = allsamples;
%获取K_L变化的特征植及特征向量
sigma = xunlian*xunlian';
[v d]=eig(sigma);
%以下选择特征值不为0的向量
p=rank(sigma);
[v d]=eig(sigma);
[ld,ind]=sort(diag(d)); % 对特征值进行索引排序
landa=ld(end:-1:1); % 从大到小排序
Ind=ind(end:-1:1); % 把对应的序号排序
for i=1:p
X(:,i)=v(:,Ind(i)); % 由大到小排前 p 个特征值的特征向量
end
base = xunlian' * X(:,1:p); %主成分分析的投影向量16384*n
% 以下计算fld的投影向量
% Sw_1 = base' * Sw' * Sw * base;
Sw_1 = base' * allsamples' * allsamples * base;
Sb_1 = base' * Sb' * Sb *base;
[fld_vectors,fld_values] = eig(Sb_1,Sw_1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%————————————————————选取90%的能量
% d2=diag(fld_values);
% dsort1=flipud(d2);
% vsort1=fliplr(fld_vectors);
% %以下选择90%的能量
% dsum=sum(dsort1);
% dsum_extract=0;
% q=0;
% while(dsum_extract/dsum<0.9)
% q=q+1;
% dsum_extract=sum(dsort1(1:q));
% end
%
% fld_values = vsort1(:,1:(q-1));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%**************************************************************
%——————————选取前q个特征向量
[ld,ind]=sort(diag(fld_values)); % 对特征值进行索引排序
landa=ld(end:-1:1); % 从大到小排序
Ind=ind(end:-1:1); % 把对应的序号排序
for i=1:q
fld_values(:,i) = fld_vectors(:,Ind(i)); % 由大到小排前 p 个特征值的特征向量
end
%%%%%%%%*************************************************************
fld_base = base * fld_values;
allcoor=allsamples * fld_base;
t1=toc; %计算特征提取时间
accu = 0;
%测试过程
tic
for i=1:100
for j=[4 5 6] %读入100 x (6-n) 副测试图像
a=imread(strcat('E:\王选\palmprint_database\palmprint_database\P_',num2str(i),'_',num2str(j),'.bmp'));
a=histeq(a); %直方图均衡化
a=double(a);
% [CA,CH,CV,CD] = dwt2(a,'db4');
% [CA1,CH1,CV1,CD1] = dwt2(CA,'db4');
% a=log10(a+1); %进行对数变换
b=a(1:128*128); %生成行向量
% b=CA1(1:37*37);
tcoor=(b-samplemean)*fld_base;
for k=1:100*n
mdist(k)=norm(tcoor-allcoor(k,:));
end;
%三阶近邻
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [dist,index2]=sort(mdist);
% class1=floor( (index2(1)-1)/n)+1;
% class2=floor((index2(2)-1)/n)+1;
% class3=floor((index2(3)-1)/n)+1;
% if class1~=class2 && class2~=class3
% class=class1;
% elseif class1==class2
% class=class1;
% elseif class2==class3
% class=class2;
% end;
% if class==i
% accu=accu+1;
% end;
% end;
% end;
% t3=toc; %计算测试时间
% accuracy=accu/(100*(6-n)) % 输出识别率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%最近邻
[dist,index2]=sort(mdist);
class1=floor( (index2(1)-1)/n)+1;
class=class1;
if class==i
accu=accu+1;
end;
end;
end;
t2=toc; %计算测试时间
accuracy=accu/(100*(6-n)) % 输出识别率
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -