我正在尝试在Matlab中实现一个非常基本的特征脸计算。它有点工作,但我只得到两个有意义的特征值 - 其余的都是零。相应的特征向量似乎是正确的,因为大多数特征向量在转换为图像时会显示特征脸。
那么为什么我的大部分特征值为零?我需要它们与零不同,以便通过它们的重要性(最大幅度特征值)对特征脸进行排序。
我正在阅读400张图片,每张图片h / w = 112/92像素 他们可以在这里找到:http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
代码:
clear all;
files = dir('eigenfaces2/training/*.pgm');
[numFaces, discard] = size(files);
h = 112;
w = 92;
s = h * w;
%calculate average face
avgFace = zeros(s, 1);
faces = [];
for i=1:numFaces
file = strcat('eigenfaces2/training/', files(i).name);
im = double(imread(file));
im = reshape(im, s, 1);
avgFace = avgFace + im;
faces(:,i) = im;
end
avgFace = avgFace ./ numFaces;
A = [];
for i=1:numFaces
diff = avgFace - faces(i);
A(:,i) = diff;
end
numEigs = 20;
L = (A' * A) / numFaces;
[tmpEigs, discard] = eigs(L, numEigs);
eigenfaces = [];
for i=1:numEigs
v = tmpEigs(:,i);
eigenfaces(:,i) = A * v;
end
%visualize largest eigenfaces
figure;
for i=1:numEigs
eigface = eigenfaces(:,i);
mmax = max(eigface);
mmin = min(eigface);
eigface = 255 .* (eigface-mmin) ./ (mmax-mmin);
eigface = reshape(eigface, h, w);
subplot(4,5,i); imshow(uint8(eigface));
end
答案 0 :(得分:1)
我对计算机视觉/图像识别没有太多经验,但我认为你可能想要
diff = avgFace - faces(:,i);
在你的第二个for循环中。否则它只是每次从avgFace中减去一个常量,因此A(因此L)只得到2的等级。