📄 gabor2pca.m
字号:
function [out_time]=gabor2pca(P_2N,P_1N)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Based on Gabor wavelets and 2DPCA+PCA
% wenchangzhi 2006/9/16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N=100; % 手掌数
M=6; % 每个手掌的图像数目
MM=3; % 训练样本数
% % 输入所有图像,由gabor_palm 函数得到运算结果.并将其保存
% for i=0:99
% for j=1:6
% i
% j
% im=imread(strcat('P_',num2str(i),'_',num2str(j),'.bmp'));
% im=double(im);
% % h=fspecial('gaussian');
% H = fspecial('gaussian',[5 5],0.5);
% imagein=filter2(H,im)/255;
% result_gabor=gaborpalm(imagein);
% eval(['save Gabor_four_eight\G' num2str(i) '_' num2str(j) ' result_gabor ' ';']);%save the result matrix
% end
% end
% 训练,输入所有的训练图像,计算其平均值
tic;%计时开始
Sum=zeros(256,40);
Temp=[];
for i=0:99
for j=1:MM
eval(['load Gabor_four_eight\G' num2str(i) '_' num2str(j) ';']);
Sum=Sum+result_gabor;
Temp=[Temp; result_gabor];
clear result_gabor;
end
end
result_mean=Sum/(N*MM);
for i=0:299
Temp(256*i+1:256*(i+1),:)=Temp(256*i+1:256*(i+1),:)-result_mean;
end
% 计算协方差矩阵A
A=Temp'*Temp/(N*MM);
% 计算此协方差矩阵的特征值和特征向量
[vector value]=eig(A);
[val index]=sort(diag(value)); % 将特征值以升序排列
colum_size=size(vector,2); % 求出特征向量的维数
for i=1:colum_size
vector_sort(:,i)=vector(:,index(colum_size-i+1));
% 将特征向量以特征值的降序排列
value_sort(i)=val(index(colum_size-i+1));
% 将特征值降序排列
end
p=0; % 提取特值的个数
value_sum=sum(value_sort);
value_extract=0;
while(p<P_2N)
p=p+1;
value_extract=sum(value_sort(1:p));
end
X= vector_sort(:,1:p); %提取出的特征向量矩阵
%计算每个gabor_result在特征空间的投影并将其存储
for i=0:99
for j=1:6
eval(['load Gabor_four_eight\G' num2str(i) '_' num2str(j) ';']);
covol_result=result_gabor*X;
eval(['save Cov_mag\Cov_re' num2str(i) '_' num2str(j) ' covol_result ;']);
clear covol_result;
end
end
% 计算2DPCA的特征向量在1DPCA上的投影
allsamples=[];
for i=0:99
for j=1:MM
eval(['load Cov_mag\Cov_re' num2str(i) '_' num2str(j) ';']);
temp=covol_result(1:end);
clear covol_result;
allsamples=[allsamples;temp];
end
end
% calculate the mean image in the training set
m=mean(allsamples,1);
% caculate the cov matrix and its eigen values and eigen vectors
for i=0:99
for j=1:MM
xmean(j+(i)*MM,:)=allsamples(j+(i)*MM,:)-m;
end
end
% covariance matrix C=xmean'*mean, A=xmean*xmean'
A=xmean*xmean';
[vector,value]=eig(A);
[val,index]=sort(diag(value)); % sort the eigen values in ascend sequence
col=size(vector,2);
for i=1:col
vecsort(:,i)=vector(:,index(col-i+1));
valsort(i)=val(index(col-i+1));
end
valsum=sum(valsort);
valextract=0;
pp=0;
%%%%% extract 90% energy
while(pp<P_1N)
pp=pp+1;
valextract=sum(valsort(1:pp));
end
%%%%% calculate the eigen vector of the matrix C
for i=1:pp
vect(:,i)=xmean'*vecsort(:,i)/sqrt(valsort(i));
co_base(:,i)=vect(:,i)./sqrt(sum(vect(:,i).^2));
end
% save co_base.mat co_base;
% load co_base.mat
for i=0:99
for j=1:6
eval(['load Cov_mag\Cov_re' num2str(i) '_' num2str(j) ';']);
Temp=covol_result(1:end);
clear covol_result;
im_weight=Temp*co_base;
eval(['save palmpca_weight\im_' num2str(i) '_',num2str(j) ' im_weight ' ';'])
end
end
out_time=toc;
% %测试
% acc=0;
% for i=0:99
% for j=4:6
% eval(['load palmpca_weight\im_' num2str(i) '_',num2str(j) ';']);
% covol_test=im_weight; %计算测试样本在特征空间的投影
% clear im_weight;
% D_all=[];
% for ii=0:99
% for jj=1:MM
% eval(['load palmpca_weight\im_' num2str(ii) '_',num2str(jj) ';']);
% distance=norm(covol_test-im_weight); % 计算测试样本点与所有的训练样本点之间的距离
% D_all=[D_all distance];
% clear im_weight;
% end
% end
% distance_all=min(D_all); % 求出最小距离
% D_part=[];
% for jjj=1:MM %计算测试样本点与该同一样本的训练样本点之间的距离
% eval(['load palmpca_weight\im_' num2str(i) '_',num2str(jjj) ';']);
% dist=norm(covol_test-im_weight);
% D_part=[D_part dist];
% clear im_weight;
% end
% distance_part=min(D_part);%求出最小距离
% if(distance_all==distance_part) %比较两个最小距离是否相等
% acc=acc+1; %若相等则正确,否则错误
% else
% i %输出识别错误的图像的标号
% j
% end
% end
% end
% accurate=acc/300 %输出正确识别率
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -