首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在我的Matlab特征面实现中我得到了这么多的特征值为零?

为什么在我的Matlab特征面实现中我得到了这么多的特征值为零?
EN

Stack Overflow用户
提问于 2012-02-17 20:38:04
回答 1查看 428关注 0票数 0

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

那么为什么我的大多数特征值都是零呢?我需要它们不同于零,以便根据它们的重要性(最大幅度特征值)对特征面进行排序。

我正在阅读400张图片,每个图片的大小都是h/w =112/92px,它们可以在这里找到:http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip

代码:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-18 02:47:00

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

代码语言:javascript
运行
复制
diff = avgFace - faces(:,i);

在你的第二个for循环中。否则,它就是每次从avgFace中减去一个常量,因此A(因此L)的秩只有2。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9328334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档