【问题标题】:Why do I get so many eigenvalues of zero in my Matlab eigenfaces implementation?为什么在我的 Matlab 特征面实现中得到这么多零特征值?
【发布时间】:2012-02-18 02:47:00
【问题描述】:

我正在尝试在 Matlab 中实现一个非常基本的特征面计算。它有点工作,但我只得到两个有意义的特征值——其余的都是零。相应的特征向量似乎是正确的,因为它们中的大多数在转换为图像时都会显示特征面。

那么为什么我的大部分特征值都为零?我需要它们不为零,以便按重要性(最大特征值)对特征面进行排序。

我正在阅读 400 张图片,每个尺寸 h/w = 112/92 px 他们可以在这里找到: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

【问题讨论】:

    标签: matlab eigenvalue


    【解决方案1】:

    我在计算机视觉/图像识别方面没有太多经验,但我想你可能想要

    diff = avgFace - faces(:,i);
    

    在你的第二个 for 循环中。否则它只是每次从 avgFace 中减去一个常数,因此 A(以及因此 L)只能获得 2 的排名。

    【讨论】:

    • 太棒了!解决了这个问题 - 那些 matlab 索引让我发疯 - 谢谢 :)
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多