📄 eigenfaces.m
字号:
% Author: A. I. Wilmer (aiw99r@ecs.soton.ac.uk)
% September 2002
TS_EXISTS=0; % if 0 regenerate the training set and do SVD on it etc etc...
% establish the training set
directories = 35; trainingSamplesPerDirectory = 10; % for directory-structured face database
trainingSamples = directories*trainingSamplesPerDirectory; fax = factor(trainingSamples); plotHt = prod(fax,2)/fax(length(fax)); plotWd = fax(length(fax));
if (TS_EXISTS==0)
disp(['Loading the training set (',num2str(trainingSamples),' images)...'])
imageSize = 92;
%exampleImage = double(imread('C:/Documents and Settings/aiw99r/My Documents/My Pictures/Brodatz Textures/D1.bmp','bmp'));
trainingSet = zeros(imageSize,imageSize,trainingSamples);
m=1;
for dirNumber = 1:directories
for tspd=1:trainingSamplesPerDirectory
exampleImage = double(imread(strcat('C:\Documents and Settings\aiw99r\My Documents\Face Databases\ATandT_Cambridge\s',num2str(dirNumber),'\',num2str(tspd),'.bmp'),'bmp'));
% exampleImage = double(imread(strcat('C:/Documents and Settings/aiw99r/My Documents/My Pictures/Faces/face',num2str(im(m)),'.bmp'),'bmp'));
exIm = exampleImage(1:imageSize,1:imageSize); % crop to the desired training sample size
trainingSet(:,:,m) = exIm;
m=m+1;
end
end
if(1==0)
im_min = min(min(min(trainingSet))); im_max = max(max(max(trainingSet)));
figure
for m=1:trainingSamples
subplot(plotHt,plotWd,m)
imshow(trainingSet(:,:,m),[im_min im_max]),title(['Original Image ',num2str(m)])
end
end
disp('Calculating mean image...')
% generate mean image
differenceImages = zeros(imageSize,imageSize,trainingSamples);
meanImage = mean(trainingSet,3);
figure,imagesc(meanImage),title('Mean Image'),colormap('gray')
disp('Calculating difference images...')
% subtract mean image to form the difference images
for m=1:trainingSamples
differenceImages(:,:,m) = trainingSet(:,:,m) - meanImage;
end
%figure
%im_min = min(min(min(differenceImages))); im_max = max(max(max(differenceImages)));
%for m=1:trainingSamples
% subplot(plotHt,plotWd,m)
% imshow(differenceImages(:,:,m),[im_min im_max]),title(['Difference Image ',num2str(m)])
%end
disp('Vectorising difference images')
% form A -- which is a vector of the difference images
A = zeros(imageSize^2,trainingSamples);
for m=1:trainingSamples
A(:,m) = reshape(differenceImages(:,:,m),imageSize^2,1);
end
% form A'A and find e-vectors and e-values
%L = (A*A');
%[eVecsOfL,eVals] = eig(L); % V = full mx with columns being e-vectors, D = diagonal mx of e-values
%eVecs = zeros(imageSize^2,trainingSamples);
%eVecs = A*eVecsOfL; % need to premultiply the e-vectors by A to get the e-vecs of A*A'
disp(['Extracting eigen-values and eigen-images from SVD (of ',num2str(size(A,1)*size(A,2)),'-element matrix)...'])
tic; [U,S,V] = svd(A,0); toc
Eimage = zeros(imageSize,imageSize,trainingSamples);
for i = 1:trainingSamples
Eimage(:,:,i) = reshape(U(:,i),imageSize,imageSize); % the columns of U are automatically the e-vectors of A*A' (i.e., the covariance matrix)
Eval(i) = S(i,i)^2; % S is a diagonal matrix of singular values, we need to square them to get eigen-values
end
if(1==0)
figure
im_min = min(min(min(Eimage))); im_max = max(max(max(Eimage)));
for m=1:trainingSamples
subplot(plotHt,plotWd,m)
% imshow(Eimage(:,:,m),[im_min im_max]),title(['Eigen-Image ',num2str(m),' with SVD'])
imagesc(Eimage(:,:,m)),title(['Eigen-Image ',num2str(m),' with SVD']),colormap('gray')
end
end
figure,plot(Eval),title('Eigen-values')
% ---------------- END OF ASIDE ----------------------
%eVecs = U(1:exImages,1:exImages);
% perform linear combinations to get the eigen-images
%eigenImage = zeros(imageSize,imageSize,trainingSamples);
%for l=1:trainingSamples
% for k=1:trainingSamples
% eigenImage(:,:,l) = eVecs(k,l)*differenceImages(:,:,k);
% end
%end
%im_min = min(min(min(eigenImage))); im_max = max(max(max(eigenImage)));
%figure
%for l=1:trainingSamples
% subplot(plotHt,plotWd,l)
% imshow(eigenImage(:,:,l),[im_min im_max]),title(['E-Image ',num2str(l)])
% imagesc(eigenImage(:,:,l)),title(['E-Image ',num2str(l)]),colormap('gray')
% disp(['Eigenvalue ',num2str(l),' : ',num2str(Eval(l))]);
%end
end
% ---------------------------------------- RECOGNITION TEST -------------------------------------------------
disp('Performing recognition...')
figure
% present a new face and attempt to recognise it
%recogniseImage = double(imread('C:/Documents and Settings/aiw99r/My Documents/My Pictures/Faces/face3.bmp','bmp'));
recogniseImage = double(imread(strcat('C:\Documents and Settings\aiw99r\My Documents\Face Databases\ATandT_Cambridge\s37\10.bmp'),'bmp'));
%recogniseImageTemp(1:121,1:160,1) = recogniseImage(1:121,2:161,1); recogniseImageTemp(1:121,161,1) = recogniseImage(1:121,1,1); recogniseImage=recogniseImageTemp; % implement a 1-pixel shift to investigate how well-posed the weights are
%recogniseImage = double(imread('C:/Documents and Settings/aiw99r/My Documents/My Pictures/Faces/lady1.bmp','bmp'));
recIm = recogniseImage(1:imageSize,1:imageSize); % crop to the desired training sample size
subplot(1,3,1),imagesc(recIm),title('Image to recognise')
% transform into eigenimage space
recDiffIm = recIm-meanImage; % firstly, subtract the mean from it to get the difference image
subplot(1,3,2),imagesc(recDiffIm),title('Mean Difference Image'),colormap('gray')
weight = zeros(trainingSamples,1);
for m=1:trainingSamples
weight(m) = (reshape(Eimage(:,:,m),imageSize^2,1))'*reshape(recDiffIm,imageSize^2,1); % do inner product of each eigenimage with the difference image to get a weight vector
end
% use the weights to remake the image
reconstructionImage = zeros(imageSize,imageSize);
for m=1:trainingSamples
reconstructionImage = reconstructionImage+(weight(m)*Eimage(:,:,m)); % should we incorporate in here (i.e., multiply weight(m) by eVals(m,m)????)
end
subplot(1,3,3),imagesc(reconstructionImage+meanImage),title('Eigen-image basis reconstruction'),colormap('gray')
figure,plot(weight),title('Weight vector for image to recognise')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -