2013-03-13 30 views
1

我正在使用奇異值分解技術進行圖像壓縮。 我在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)); 

請幫助我如何保存壓縮文件。

+4

如果您使用SVD減少文件大小,只保留保留的奇異值和左右特徵向量。不要重建圖像並保存,這是毫無意義的。 – abcd 2013-03-13 05:06:03

+0

我想我只是在我的代碼中建議的。 – user59489 2013-03-13 05:53:52

+0

仍然沒有區別。壓縮文件的大小超過了文件的原始大小。 – user59489 2013-03-13 08:44:29

回答

1

正如Lorem Ipsum所說,你不是在保存壓縮圖像,而是在保存重建圖像本身(Q是重建圖像)。所以你的文件將會和一個8位的.bmp文件一樣大......

即使只保存相關的奇異值和相應的矢量,它也不應小於.jpg格式文件。 Jpeg已經被嚴重壓縮,比SVD更好的技術...

+0

好。但我還有一個疑問。那就是,在代碼中,我使用了圖像(225 * 225 * 3,即151875位)進行壓縮,並且我用p = 100進行了壓縮,因此我獲得了135300位的圖像大小。意味着我壓縮圖像的尺寸較小嗎? – user59489 2013-03-13 10:40:50

+0

否,225 * 225 * 3是您必須保存的數量。如果將它保存在24位BMP中,那麼在8位BMP中將是225 * 225 * 3 * 24,即225 * 225 * 3 * 8 ...現在您創建一個矩陣Q,即225 * 225 * 3並將它保存在uint8中,這樣就是225 * 225 * 3 * 8位的數據。如果你只在uint8中保存奇異值和相應的矢量,你可以保存(100 + 225 * 100 * 2)* 3 * 8(= 135300 * 8),然後像解壓縮圖像一樣計算Q 。但是如果你保存的Q仍然是225 * 225 * 3整數你必須保存。 – 2013-03-13 12:10:32

+0

非常感謝。 – user59489 2013-03-13 15:43:49