使用 SVD 而不是协方差矩阵来计算特征脸

Using the SVD rather than covariance matrix to calculate eigenfaces

我正在使用来自 AT&T (http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html) 的一组 n = 40 张面孔来尝试通过 SVD 生成特征脸。

首先我计算平均向量:

然后我从训练集中的每个向量中减去它,将新向量重塑为 n x (p*q) 矩阵 x 的 1 x (p*q) 列向量,并计算矩阵 X 使得X = (1/sqrt(n))*x。 (这就是问题所在:我在 X 中的所有结果都四舍五入为 0,导致特征脸的图像结果为黑色,如下所示)

然后我计算这个矩阵 X 的 SVD 并尝试通过将它重新整形为 p x 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))

做同样的事情,遇到同样的问题。简短的回答是你必须归一化你的特征向量才能得到好的图像。在归一化之前,您会注意到您的矢量值非常接近 0(可能是因为 svd 是如何完成的)这可能意味着它们接近黑色。

无论如何,对你想要变换的特征向量使用这个方程: newpixel[i,j]=(oldpixel[i,j]-min(oldpixel[:,j]))/(max(oldpixel[:,j])--min(oldpixel[:,j]))