I=imread(\'cameraman.tif\');
figure(1),imshow(I)
I1=im2double(I);
[U,S,V]=svd(I1);
figure(2),imshow(I1)
for j=1:90
I2=U(:,1:j)*S(1:j,1:j)*V(:,1:j)\';
end
figure(
I think you're missing the point of SVD decomposition. the size of the reconstructed image will remain the same re the number of pixels. what SVD does is allow you to store/transmit less information... in other words, in your case, you can transmit 256^2 doubles or (256*j)+j+(256*j). for j of 90 it's 46170 (vs 65536)
Here is an illustrative example:
I = imread('cameraman.tif');
X = im2double(I);
%# SVD
[U S V] = svd(X);
%# variance explained by each eigenvector
variances = abs(diag(S).^2);
plot(cumsum(variances)./sum(variances), 'b.-'), ylim([0 1])
title('SVD'), xlabel('i^{th} Component'), ylabel('Variance explained')
%# iterate over number of components to keep
figure
subplot(121), imshow(X), title( sprintf('size=%d',numel(X)) )
subplot(122)
for p = 1:(size(U,2)/2-1)
%# truncated SVD
Up = U(:,1:p);
Vp = V(:,1:p);
Sp = diag(S(1:p,1:p));
%# reconstruct/compress
XHat = Up * diag(Sp) * Vp'; %'# approximation
err = mean( abs(X(:)-XHat(:)) ); %# mean absolute error
sz = (numel(Up) + numel(Vp) + numel(Sp)); %# new size
%# show
imshow(XHat)
title( sprintf('p=%d, size=%d, err=%g', p, sz, err) )
%# flush output
drawnow
end