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

前端 未结 2 490
佛祖请我去吃肉
佛祖请我去吃肉 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: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

提交回复
热议问题