2012-02-17 112 views
0

我想在Matlab中實現一個非常基本的特徵臉計算。這種方法很有用,但我只能得到兩個有意義的特徵值 - 其餘的都是零。相應的特徵向量似乎是正確的,因爲它們中的大多數在轉換爲圖像時將顯示特徵臉。爲什麼我的Matlab特徵臉實現中有很多零特徵值?

那麼爲什麼我的特徵值大部分爲零?我需要它們與零不同,以便根據它們的意義(最大幅度特徵值)對特徵臉進行排序。

我讀400個圖像,每個尺寸H/W =九十二分之一百十二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 

回答

1

我已經沒有太多經驗與計算機視覺/圖像識別,但我想你可能想要

diff = avgFace - faces(:,i); 

在你的第二個for循環。否則它只是每次從avgFace減去一個常量,所以A(因此L)只能得到2的等級。

+1

太棒了!解決了這個問題 - 那些matlab索引讓我發瘋 - 謝謝:) – 2012-02-17 19:33:25