我正在使用奇異值分解技術進行圖像壓縮。 我在Matlab中爲它編寫代碼。我壓縮了一個文件大小爲8.15KB的圖像(255 * 255 * 3)。當我保存壓縮圖像(以jpg格式)時,其文件大小超過原始圖像文件大小。如何在MATLAB中保存壓縮圖像
B=imread('lena.jpg');
figure,
imshow(B), title(sprintf('size=%d',numel(B))) // displaying the original image
A=im2double(B);
A1=A(:,:,1);
A2=A(:,:,2);
A3=A(:,:,3);
tic;
// applying svd for each layer
[U1,S1,V1]=svd(A1);
[U2,S2,V2]=svd(A2);
[U3,S3,V3]=svd(A3);
// reconstuctin compressed image
p=100;
U1p=U1(:,1:p);
V1p=V1(:,1:p);
S1p=diag(S1(1:p,1:p));
C1=U1p * diag(S1p) * V1p';
C1=255*C1;
C1=uint8(C1);
U2p=U2(:,1:p);
V2p=V2(:,1:p);
S2p=diag(S2(1:p,1:p));
C2=U2p * diag(S2p) * V2p';
C2=255*C2;
C2=uint8(C2);
U3p=U3(:,1:p);
V3p=V3(:,1:p);
S3p=diag(S3(1:p,1:p));
C3=U3p * diag(S3p) * V3p';
C3=255*C3;
C3=uint8(C3);
Q(:,:,1)=C1;
Q(:,:,2)=C2;
Q(:,:,3)=C3;
// finding size and error of the compressed image
sz = (3*(numel(U1p) + numel(V1p) + numel(S1p)));
err = mean(abs(B(:)-Q(:)));
toc;
t=toc;
// displying the compressed image
figure,
imshow(Q)
title(sprintf('p=%d, size=%d,err=%d', p, sz,err));
請幫助我如何保存壓縮文件。
如果您使用SVD減少文件大小,只保留保留的奇異值和左右特徵向量。不要重建圖像並保存,這是毫無意義的。 – abcd 2013-03-13 05:06:03
我想我只是在我的代碼中建議的。 – user59489 2013-03-13 05:53:52
仍然沒有區別。壓縮文件的大小超過了文件的原始大小。 – user59489 2013-03-13 08:44:29