how to check whether the image is compressed or no

2019-01-19 06:29发布

问题:

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(3),imshow(I2)
I3=U*S*V';
figure(4),imshow(I3)

this is the code i have written for SVD decomposition ,i got correct output.But the size of compressed image is greater than original image,so how to calculate whether after svd image is compressed or not,that means i got size of the image on disk after applying svd iterations is greater than the original image.

回答1:

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



回答2:

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)