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

问题描述 投票:4回答:1

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

首先,我计算平均向量:

average

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

然后我计算了这个矩阵X的SVD,并尝试通过将其重新形成一个p乘q矩阵来得到酉矩阵第一列的第一个特征脸。

但是,这是我的结果:

eigenface 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))
matlab image-processing computer-vision svd
1个回答
3
投票

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

无论如何,在你想要转换的特征向量上使用这个等式:newpixel[i,j]=(oldpixel[i,j]-min(oldpixel[:,j]))/(max(oldpixel[:,j])--min(oldpixel[:,j]))

© www.soinside.com 2019 - 2024. All rights reserved.