2012-02-17 7 views
0

私はMatlabで非常に基本的なeigenface計算を実装しようとしています。それは動作しますが、意味のある固有値は2つしかありません。残りはゼロです。対応する固有ベクトルは正しいと思われるが、そのほとんどは画像に変換するときに固有顔を示すからである。Matlab固有空間の実装で、非常に多くの固有値が0になるのはなぜですか?

なぜ私の固有値の大部分はゼロですか?固有値をその重要度(最大の大きさの固有値)でソートするために、それらをゼロとは異なるものにする必要があります。

私は彼らがここで見つけることができる400枚の画像、ワット各サイズH /を読ん= 92分の112ピクセル ています: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 

答えて

1

私は多くを持っていないしましたコンピュータビジョン/画像認識の経験がありますが、私はあなたが望むかもしれないと思います。

diff = avgFace - faces(:,i); 

2番目のforループでは、そうでなければ、毎回avgFaceから定数を減算するだけで、A(したがってL)は2のランクしか得ません。

+1

素晴らしい!それは問題を解決しました - それらのMATLABインデックスは私を怒らせる運転しています - ありがとう:) –

関連する問題