1

特異値分解技術を使用して画像圧縮を行っています。そのためのコードを 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) );

圧縮ファイルの保存方法を教えてください。

4

1 に答える 1

1

Lorem Ipsum が言ったように、圧縮された画像を保存するのではなく、再構築された画像自体を保存しています (Q は再構築された画像です)。したがって、ファイルは8ビットの.bmpファイルと同じ大きさになります...

また、関連する特異値と対応するベクトルのみを保存したとしても、.jpg 形式のファイルより小さくすることはできません。JPEGは既に大幅に圧縮されており、SVD よりも優れた技術を使用しています...

于 2013-03-13T08:56:29.200 に答える