Asked by Iktech
on 11 Aug 2017

Hi All, I have been trying to reconstruct a test image from the eigenvectors generated from the pca function, however the reconstructed image is different from the test image (see figure). The test image is simply one of the images used in the training set. I also tried obtaining the eigenvectors using the cov and eig functions but I still end up with the same problem. I need to use the pca function and will appreciate any help on how to obtain the eigenvectors from its output.

Find the code below. I have also attached a zip file containing the matlab code and images I used. Thanks in anticipation.

M = 10; % number of images

for n=1:M

im = imread(strcat(num2str(n),'.jpg')); %read image

im = im2double(rgb2gray(im)); % convert image to gray scale and then to double precision

[r,c] = size(im); % get number of rows and columns in image

I(:,n) = im(:); % convert image to vector and store as column in matrix I

end

% calculate mean image

I_mean = mean(I,2);

% subtract mean image from the set of images

I_shifted = I-repmat(I_mean,1,M);

%perform PCA. Matrix I was used as input instead of I_shifted because Matlab documentation states that pca function centers the data

[coeff,score,latent,~,explained,mu] = pca(I);

%calculate eigenfaces

eigFaces = I_shifted*coeff;

% put eigenface in array and display

ef = [];

for n = 1:M

temp = reshape(eigFaces(:,n),r,c);

temp = histeq(temp,255);

ef = [ef temp];

end

figure;

imshow(ef,'Initialmagnification','fit');

title('Eigenfaces');

% load one of the training images to test reconstruction

im = im2double(rgb2gray(imread('1.jpg'))); % convert to gray and then to double

I_test = im(:); % convert image to vector

I_test = I_test-I_mean; % subtract mean images

%calculate weights of test image

I_test_weights = zeros(M,1);

for jj = 1:M

I_test_weights(jj,1) = dot(I_test,eigFaces(:,jj));

end

% reconstruct test image

I_recon = I_mean + eigFaces*I_test_weights;

%reshape reconstructed test image

I_recon = reshape(I_recon, r,c);

%display original and reconstructed test image

figure

subplot(1,2,1);

imshow(im);

title('Original test image');

subplot(1,2,2)

imshow(I_recon);

title('Reconstructed test image');

Answer by Faiz Gouri
on 17 Aug 2017

Accepted Answer

Iktech
on 19 Aug 2017

Sign in to comment.

Answer by William MacTurk
on 10 Dec 2018

I'm working on an assignment for using pca/eigenfaces to reconstruct images, and I have it working. It can reconstruct both test and train images. I recognize the problem with your image - it took me a while to figure it out. In my case, what did the trick was just converting the image array to uint8 type (instead of double) before displaying the image. My input images were all .pgm format, though, so they were read in as uint8 arrays - not sure if that's also the case in your implementation. Anyway, give it a shot, hopefully it can help. Just add the lines

I_recon = uint8(I_recon);

im = uint8(im);

right before your first figure command.

Answer by ABHILASH SINGH
on 8 Nov 2019 at 17:11

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.