how to check whether the image is compressed or not after applying SVD on that image(regarding size of compressed image on disk)

前端 未结 2 485
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-10 19:19
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(         


        
相关标签:
2条回答
  • 2020-12-10 19:52

    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)

    0 讨论(0)
  • 2020-12-10 19:55

    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
    

    var svd_approx

    0 讨论(0)
提交回复
热议问题