2013-05-11 2 views
0

У меня есть набор 17 изображений в градациях серого ... и когда вы пытаетесь его просмотреть, я получаю черные изображения вместо призраков, как картинки.Eigenfaces показывает пустое изображение в matlab

matlab image

input_dir = 'images'; 
image_dims = [60, 60]; 

filenames = dir(fullfile(input_dir, '*.jpg')); 
num_images = numel(filenames); 
images = []; 
for n = 1:num_images 
    filename = fullfile(input_dir, filenames(n).name); 
    img = imresize(imread(filename),[60,60]); 
    if n == 1 
     images = zeros(prod(image_dims), num_images); 
    end 
    images(:, n) = img(:); 
end 

% Trainig 

% steps 1 and 2: find the mean image and the mean-shifted input images 
mean_face = mean(images, 2); 
shifted_images = images - repmat(mean_face, 1, num_images); 

% steps 3 and 4: calculate the ordered eigenvectors and eigenvalues 
[evectors, score, evalues] = princomp(images'); 

% step 5: only retain the top 'num_eigenfaces' eigenvectors (i.e. the principal components) 
num_eigenfaces = 20; 
evectors = evectors(:, 1:num_eigenfaces); 

% step 6: project the images into the subspace to generate the feature vectors 
features = evectors' * shifted_images; 

и увидеть eignevalues ​​я использовал этот код

figure; 
for n = 1:num_eigenfaces 
    subplot(2, ceil(num_eigenfaces/2), n); 
    evector = reshape(evectors(:,n), image_dims); 
    imshow(evector); 
end 

я не думаю, что это было предположить, чтобы быть. может кто-то указать, что я сделал неправильно?

+0

каковы размеры shifted_images – Suedocode

+0

Я не уверен, что это то, что вам нужно ... но Matlab говорит (3600X17), и у меня есть 17 обучающих образов. –

ответ

0

Вы должны проверить каждый шаг кода и убедиться, что они прошли проверку на работоспособность. Я думаю, это

features = evectors' * shifted_images; 

Должно быть это

features = shifted_images * evectors; 

Что заставляет меня задаться вопросом, если shifted_images имеет правильные размеры. Эвекторы должны быть матрицей, где каждый столбец представляет собой компонентный вектор. Матрица будет [pics x n]. Сдвинутые изображения должны быть матрицей [pixcount x pics]. «pixcount» - количество пикселей на каждом изображении, а «pics» - количество изображений. Если evectors' * shifted_images работает без ошибки размеров, мне интересно, правильно ли вычисляется одно количество. Я думаю, что это транспонированная является виновником:

princomp(images'); 
+0

Я пробовал это, и я получаю эту ошибку. Ошибка при использовании * Размеры внутренней матрицы должны совпадать. 'Ошибка в PCA (строка 32) features = shifted_images * evectors;' –

0

Попробуйте масштабировать изображение:

for i=1:num_eigenfaces 
    subplot(1,7,i); 
    image=reshape(evectors(:,i), image_dims); 
    image=image'; 
    %scale image to full scale 
    imshow(image, []); 
end 
Смежные вопросы