Demo entry 6741546

matlab

   

Submitted by anonymous on May 16, 2018 at 06:42
Language: Matlab. Code size: 2.2 kB.

clc 
usersetting;%创建用户信息

typenum = 17;%类别个数,几个个人意思
%--每一类训练图像树目  
totalnumpertype = 10;%每类总共10幅图 
trainnumpertype = 6;%前trainnumpertype副图像作为训练样本 

pcadim = 45;%降维维数k

goalsize = [112 92];%要归一化的图片大小,要保持图片大小一致 

trainlabel = [];%训练的标签
samples = [];%存放所有人脸样本
tic %计时入口
for i=1:typenum %遍历每个人
   %先求训练图像的特征库 train
   %挨着读取图像
    for j=1:trainnumpertype
        fn = sprintf('人脸库/%02d/s%d.bmp',i,j); 
        I = imread(fn);%读取图像
        %下面转为灰度图像
        [M,N,color] = size(I);%获取图片的大小,以及色彩类型 
        if color == 3%如果是彩色图片
            I = rgb2gray(I);%转为灰度图片
        end
        
%         %图像预处理
%       I= imadjust(I,stretchlim(I));%灰度变换,图像增强
        
        if (isequal([M,N],goalsize) == 0)%如果不是目标大小
            I = imresize(I,goalsize);%转为固定的目标大小
        end
        
        I1 = I(:);%图像转为1列矩阵
        samples = [samples I1];%都存入samples内
       
        trainlabel = [trainlabel;i];%每个样本的标签
    end
    
end

%计算PCA,提取PCA投影矩阵
samples = double(samples);
samples = samples';
fileNumber = size(samples,1);%总的训练样本的个数

if pcadim > fileNumber
    pcadim = fileNumber;%降低的维数最低等于样本数
end
mA=mean(samples);%样本均值
Z=(samples-repmat(mA,fileNumber,1));%每一个都减去均值
T=Z*Z';
[V,D]=eigs(T,pcadim);%计算T的最大的k个特征值和特征向量
V=Z'*V;%协方差矩阵的特征向量
for i=1:pcadim%特征向量单位化
    l=norm(V(:,i));
    V(:,i)=V(:,i)/l;
end
PCAfeatures=Z*V;%线性变换,降至k维,FV_Inquire1是fileNumber*k维的矩阵,每一行是k个数字,代表一个图片的特征

%确定个阈值
dists = [];
for i=1:fileNumber
    feature1 = PCAfeatures(i,:);%取出一个图的pca特征
    type1 = trainlabel(i);%这个图的类别
    for j=i+1:fileNumber
        feature2 = PCAfeatures(j,:);%取出一个图的pca特征
         type2= trainlabel(j);%这个图的类别
         if(type1 == type2)%每个图 都和自己同类的图坐下距离
             dist = mydist(feature1,feature2);%计算这俩图的距离
             dists = [dists,dist];%距离存入列表
         end
    end
end
%得到了同类图片之间最大的差异值
maxdist = max(dists);
thresholdvalue = maxdist*2;%用这个当做阈值


%将提取的pca参数,以及特征库等存入mat中
save trainresult.mat goalsize mA V PCAfeatures trainlabel typenum totalnumpertype trainnumpertype thresholdvalue

toc %计时出口
str = sprintf('训练完毕,训练%d人,每人%d张照片。',typenum,trainnumpertype);
disp(str)  
msgbox(str)
    

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).