?? pca.m
字號:
%PCA人臉識別
imgdata=[];%訓(xùn)練圖像矩陣
for i=1:40
for j=1:5
a=imread(strcat('C:\Documents and Settings\Administrator\桌面\orl\s',num2str(i),'\',num2str(j),'.jpg'));
% imshow(a);
b=a(1:112*92); % b是行矢量 1×N,其中N=10304
b=double(b);
imgdata=[imgdata; b]; % imgdata 是一個M * N 矩陣,imgdata中每一行數(shù)據(jù)一張圖片,M=200
end;
end;
imgdata=imgdata'; %每一列為一張圖片
imgmean=mean(imgdata,2); % 平均圖片,N維列向量
for i=1:200
minus(:,i) = imgdata(:,i)-imgmean; % minus是一個N*M矩陣,是訓(xùn)練圖和平均圖之間的差值
end;
covx=minus'* minus; % M * M 階協(xié)方差矩陣
[COEFF, latent,explained] = pcacov(covx'); %PCA,用協(xié)方差矩陣的轉(zhuǎn)置來計算以減小計算量
%選擇構(gòu)成95%的能量的特征值
i=1;
proportion=0;
while(proportion < 95)
proportion=proportion+explained(i);
i=i+1;
end;
p=i-1;
% 訓(xùn)練得到特征臉坐標系
i=1;
while (i<=p && latent(i)>0)
base(:,i) = latent(i)^(-1/2)*minus * COEFF(:,i); % base是N×p階矩陣,用來進行投影,除以latent(i)^(1/2)是對人臉圖像的標準化
i = i + 1;
end
% 將訓(xùn)練樣本對坐標系上進行投影,得到一個 p*M 階矩陣為參考
reference = base'*minus;
accu = 0;
accu = 0; %計算準確度
% 測試過程
for i=1:40
for j=6:10 %讀入40 x 5 副測試圖像
a=imread(strcat('C:\Documents and Settings\Administrator\桌面\orl\s',num2str(i),'\',num2str(j),'.jpg'));
b=a(1:10304);
b=double(b);
b=b';
object = base'*(b-imgmean);
distance=100000;
%最小距離法,尋找和待識別圖片最為接近的訓(xùn)練圖片
for k=1:200
temp= norm(object - reference(:,k));
if (distance > temp)
which = k;
distance = temp;
end;
end;
temp1 = which/5;
if (temp1 == floor(temp1))
left = (temp1-1)*5;
right = temp1*5;
else
left = floor(temp1)*5;
right = ceil(temp1)*5;
end;
if (((i-1)*5+j-5>left)&&((i-1)*5+j-5<=right)) %正確識別
accu = accu+1;
end;
end;
end;
accuracy=accu/200 %輸出識別率
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -