-
Notifications
You must be signed in to change notification settings - Fork 1
/
EigenfaceCore.sci
61 lines (55 loc) · 2.65 KB
/
EigenfaceCore.sci
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function [m, A, Eigenfaces] = EigenfaceCore(T)
// Use Principle Component Analysis (PCA) to determine the most
// discriminating features between images of faces.
//
// Description: This function gets a 2D matrix, containing all training image vectors
// and returns 3 outputs which are extracted from training database.
//
// Argument: T - A 2D matrix, containing all 1D image vectors.
// Suppose all P images in the training database
// have the same size of MxN. So the length of 1D
// column vectors is M*N and 'T' will be a MNxP 2D matrix.
//
// Returns: m - (M*Nx1) Mean of the training database
// Eigenfaces - (M*Nx(P-1)) Eigen vectors of the covariance matrix of the training database
// A - (M*NxP) Matrix of centered image vectors
//
//
// Calculating the mean image
S=uint16(T);
for i=1:36000
su=sum(S(i,:));
m(i)=su/80;// Computing the average face image m = (1/P)*sum(Tj's) (j = 1 : P)
end
Train_Number = size(T,2);
// Calculating the deviation of each image from mean image
A = [];
for i = 1 : Train_Number
temp = uint16(T(:,i)) - m; // Computing the difference image for each image in the training set Ai = Ti - m
A = [A temp]; // Merging all centered images
end
// Snapshot method of Eigenface methos
// We know from linear algebra theory that for a PxQ matrix, the maximum
// number of non-zero eigenvalues that the matrix can have is min(P-1,Q-1).
// Since the number of training images (P) is usually less than the number
// of pixels (M*N), the most non-zero eigenvalues that can be found are equal
// to P-1. So we can calculate eigenvalues of A'*A (a PxP matrix) instead of
// A*A' (a M*NxM*N matrix). It is clear that the dimensions of A*A' is much
// larger that A'*A. So the dimensionality will decrease.
L = A'*A; // L is the surrogate of covariance matrix C=A*A'.
[R,diagevals]=spec(L) // Diagonal elements of D are the eigenvalues for both L=A'*A and C=A*A'.
// Sorting and eliminating eigenvalues
// All eigenvalues of matrix L are sorted and those who are less than a
// specified threshold, are eliminated. So the number of non-zero
// eigenvectors may be less than (P-1).
L_eig_vec = [];
for i = 1 : size(V,2)
if( S(i,i)>1 )
L_eig_vec = [L_eig_vec V(:,i)];
end
end
// Calculating the eigenvectors of covariance matrix 'C'
// Eigenvectors of covariance matrix C (or so-called "Eigenfaces")
// can be recovered from L's eiegnvectors.
Eigenfaces = A * L_eig_vec; // A: centered image vectors
endfunction