Matlab 如何在图像上应用SVD后检查图像是否被压缩(关于磁盘上压缩图像的大小)
这是我为SVD分解编写的代码,我得到了正确的输出。但是压缩图像的大小比原始图像大,所以如何计算SVD图像压缩后是否,这意味着,在应用svd迭代后,我得到的磁盘上的图像大小大于原始图像。我认为您忽略了svd分解的要点。重建图像的大小将与像素数保持相同。SVD允许您存储/传输更少的信息。。。换句话说,在您的情况下,您可以传输256^2倍或(256*j)+j+(256*j)。90的j是46170(对65536)以下是一个示例:Matlab 如何在图像上应用SVD后检查图像是否被压缩(关于磁盘上压缩图像的大小),matlab,linear-algebra,image-compression,svd,Matlab,Linear Algebra,Image Compression,Svd,这是我为SVD分解编写的代码,我得到了正确的输出。但是压缩图像的大小比原始图像大,所以如何计算SVD图像压缩后是否,这意味着,在应用svd迭代后,我得到的磁盘上的图像大小大于原始图像。我认为您忽略了svd分解的要点。重建图像的大小将与像素数保持相同。SVD允许您存储/传输更少的信息。。。换句话说,在您的情况下,您可以传输256^2倍或(256*j)+j+(256*j)。90的j是46170(对65536)以下是一个示例: I=imread('cameraman.tif'); figure(1),
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)
你是指I3的像素大小>I1的像素大小,还是图像在磁盘上的大小以字节为单位更大?实际上它是
(256*j)+j+(256*j)
,因为我们只取S
的对角线(单数值,其余为零)
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