我正在使用来自AT&T的40张人脸数据集(http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html),尝试通过奇异值分解生成特征脸。
首先计算平均向量:
然后从训练集中的每个向量中减去平均向量,将新向量改变形状为一个n乘以(p*q)的矩阵x中的1乘以(p*q)列向量,并计算一个矩阵X使得X=(1/sqrt(n))*x
。(问题出在这里: 我在X中得到的所有结果都四舍五入为0,导致特征脸产生黑色图像结果如下所示)
然后我计算该矩阵X的奇异值分解,并尝试通过将其重新变形为p乘以q矩阵来获取第一列的单元矩阵的第一个特征脸
然而,这是我的结果:
有人能发现我的代码错误吗? 任何答案都将不胜感激。
n = 40;
%read images
A = double(imread('faces_training/1.pgm'));
f(:, :, 1) = A;
for j = 2:n
f(:, :, j) = double(imread(['faces_training/',num2str(j),'.pgm']));
A = A + f(:, :, j);
end
%calculate average
a = (1/n)*A;
%imshow(uint8(a))
for i = 1:n
%subtract from images
x_vector(:, i) = reshape(f(:, :, i) - a, [], 1);
end
X = (1/sqrt(n))*x_vector;
%svd
[U S V] = svd(X);
B = reshape(U(:, 1), [size(a, 1) size(a, 2)]);
imshow(uint8(B))
imshow(B)
而不是imshow(uint8(B))
可以吗? - Luis Mendouint8
,因为您将得到所有的零。要么使用imshow(B)
,要么使用imshow(uint8(255*B))
都可以。 - Luis MendoB
时可能是一个归一化问题。我已经添加了图像处理标签,这样你就可以得到更多的帮助。 - Luis Mendo