【问题标题】:How to save compressed image in matlab如何在matlab中保存压缩图像
【发布时间】:2013-03-13 16:56:29
【问题描述】:

我正在使用奇异值分解技术进行图像压缩。 我在 Matlab 中为它编写了代码。我压缩了一个文件大小为 8.15KB 的图像(255*255*3)。当我保存压缩图像(以 jpg 格式)时,它的文件大小超过了原始图像文件的大小。

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 减小文件大小,请仅保存保留的奇异值和左右特征向量。不要重建图像并保存,这是没有意义的。
  • 我想我只按照你在我的代码中的建议做了。
  • 仍然没有区别。压缩后的文件大小超过了文件的原始大小。

标签: matlab


【解决方案1】:

正如 Lorem Ipsum 所说,您不是在保存压缩图像,而是在保存重建图像本身(Q 是重建图像)。因此,您的文件将与 8 位 .bmp 文件一样大...

即使你只保存相关的奇异值和对应的向量,它也不应该小于 .jpg 格式的文件。 Jpeg 已经被高度压缩,比 SVD 有更好的技术...

【讨论】:

  • 很好。但我还有一个疑问。在代码中,我使用图像(225*225*3 即 151875 位)进行压缩,并且我使用 p=100 进行压缩,所以我得到的图像大小为 135300 位。意味着我用较小的尺寸压缩了图像吗?。
  • 不,225*225*3 是您必须保存的号码数量。如果将其保存为 24 位 BMP,则为 225*225*3*24,在 8 位 BMP 中,则为 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 整数你必须保存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2019-05-22
  • 1970-01-01
  • 2012-06-14
  • 2012-09-28
  • 2018-02-14
相关资源
最近更新 更多