1、特征人脸
function [] = eigface()
allsamples=[];
for i=1:7
a=imread( strcat( ‘C:\Users\lenvo\Desktop\图’ , ‘’ ,num2str(i), ‘.BMP’ ) );
b=a( 1:100100 );
b=double(b);
allsamples=[ allsamples; b ];
end
samplemean=mean(allsamples);
for i=1:7
xmean(i,:)=allsamples(i,:)-samplemean;
end;
sigma=xmeanxmean’; [v d]=eig(sigma);
d1=diag(d);
dsort = flipud(d1);
vsort = fliplr(v);
dsum = sum(dsort);
dsum_extract = 0;
p = 0;
while( dsum_extract/dsum < 0.9)
p = p + 1;
dsum_extract = sum(dsort(1:p));
end
p=6;
base = xmean’ * vsort(:,1:p) * diag(dsort(1:p).^(-1/2));
for ( k=1:p )
hape( base(:,k), 100,100);
newpath = [‘C:\Users\lenvo\Desktop\test’ int2str(k) ‘.jpg’];
imwrite( mat2gray(temp), newpath );
end
avg = reshape(samplemean, 100,100);
imwrite(mat2gray(avg), ‘C:\Users\lenvo\Desktop\test\average.jpg’);
save(‘C:\Users\lenvo\Desktop\test\eigface.mat’, ‘base’, ‘samplemean’);
2、识别
allsamples=[];
for i=1:7
a=imread( strcat( ‘C:\Users\lenvo\Desktop\ 图
’ , ‘’ ,num2str(i), ‘.BMP’ ) );
b=double(b);
allsamples=[ allsamples; b ];
end
samplemean=mean(allsamples);
for i=1:7
xmean(i,:)=allsamples(i,:)-samplemean;
end;
sigma=xmeanxmean’;
[v d]=eig(sigma);
d1=diag(d);
dsort = flipud(d1);
vsort = fliplr(v);
dsum = sum(dsort);
dsum_extract = 0;
p = 0;
while( dsum_extract/dsum < 0.9)
p = p + 1;
dsum_extract = sum(dsort(1:p));
end
i=1;
base = xmean’ * vsort(:,1:p) * diag(dsort(1:p).^(-1/2));
allcoor = allsamples * base;
accu = 0;
for j=1:3
a=imread( strcat( ‘C:\Users\lenvo\Desktop\test3’ , ‘’ ,num2str(i), ‘.BMP’ ) );
b=a(1:10000);
b=double(b); tcoor= b * base;
for k=1:7
mdist(k)=norm(tcoor-allcoor(k,:));
end;
[dist,index2]=sort(mdist);
class1=floor( (index2(1)-1)/5 )+1;
class2=floor((index2(2)-1)/5)+1;
class3=floor((index2(3)-1)/5)+1;
if class1~=class2 && class2~=class3
class=class1;
elseif class1class2
class=class1;
elseif class2class3
class=class2;
end;
if class==i
accu=accu+1;
end;
end;
accuracy =accu/7
3.重构
function [] = Reconstruct()
load C:\Users\lenvo\Desktop\test\eigface.mat;
a=imread(‘C:\Users\lenvo\Desktop\test2\10.bmp’);
b=a( 1:100100 ); b=double(b);
b=b-samplemean;
c = b * base;
t = 2;
temp = base(:,1:t) * c(1:t)’;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 100,100)),C:\Users\lenvo\Desktop\1.jpg)
t = 4;
temp = base(:,1:t) * c(1:t)’;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 100,100)),‘C:\Users\lenvo\Desktop\2.jpg’);
t = 6;
temp = base(:,1:t) * c(1:t)’;
temp = temp + samplemean’;
imwrite(mat2gray(reshape(temp, 100,100)),‘C:\Users\lenvo\Desktop\3.jpg’);
给出ORL人脸数据库,共有400幅人脸图像(40人,每人10幅,大小为92*112象素)
通过取不同的前N个最大特征向量,如最大的10个表示为190:200,得到如下识别率的数据:
190:200 识别率为: 0.9100
180:200 识别率为: 0.9350
170:200 识别率为: 0.9450
160:200 识别率为: 0.9500
150:200 识别率为: 0.9450
140:200 识别率为: 0.9500
130:200 识别率为: 0.9400
120:200 识别率为: 0.9500
110:200 识别率为: 0.9450
100:200 识别率为: 0.9450
50:200 识别率为: 0.9500
20:200 识别率为: 0.9600
1:200 识别率为: 0.9600
当最大特征向量达到30个以后识别率已经固定在0.9450。再增加提高已经不大。