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

mic*_*ah5 5 matlab image-processing computer-vision svd

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

首先,我计算平均向量:

平均

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

然后,我计算此矩阵X的SVD,并尝试通过将q整形为ap来获得the矩阵第一列的第一本征面

但是,这是我的结果:

特征面1

谁能在下面的代码中发现我的错误?任何答案都非常感谢

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))
Run Code Online (Sandbox Code Playgroud)

小智 4

做同样的事情,遇到同样的问题。简而言之,您必须对特征向量进行标准化才能获得良好的图像。在标准化之前,您\xe2\x80\x99会注意到您的向量值非常接近0(可能是因为svd的完成方式),这可能意味着它们\xe2\x80\x99接近黑色。

\n\n

无论如何,请在您想要变换的特征向量上使用这个方程:\nnewpixel[i,j]=(oldpixel[i,j]-min(oldpixel[:,j]))/(max(oldpixel[:,j])--min(oldpixel[:,j]))

\n