现在时间是:
当前位置:首 页 >> Matlab>> 教学区>> 文章列表

16074303 作业7 实训3 图片压缩

作者:黄彩双   发布时间:2019-05-21 19:11:17   浏览次数:96

1.   问题:通过SVD分解,压缩图像。

(1)灰色图片的压缩

(2)彩色图片的压缩

 

1)灰度图像压缩

     分析

灰色图片压缩,通过imread()读入图片数据I

转换图片数据存储类型为浮点型;

通过SVD分解矩阵,分解出USV,三个矩阵, [U S V]=svd(I);%svd奇异分解;

矩阵I=U*S*V’,取UV的前k列,S的前k行和前k列,即Ik=U(:,1:k)*S(1:k,1:k)*V(:,1:k)'

最后展示压缩的图片,这里要先把Ik数据存储类型转换回图片读入时的存储类型unit8,即imshow(uint8(Ik));

     代码:

I=imread('D:4.jpg');  %图片必须是灰度图片

% I=rgb2gray(I);%灰度化矩阵

I=double(I);%转换存储类型为浮点型

[U S V]=svd(I);%svd奇异分解

for k=1:100

    Ik=U(:,1:k)*S(1:k,1:k)*V(:,1:k)';%U的前k列,S的前k行,前k列,V的前k

    figure;

    imshow(uint8(Ik));

end

实验结果:


原图:


K=72时的图像:


 

2)彩色图像压缩

分析:类似于灰色图片压缩方法,区别在于I为四元数矩阵,RGB分别表示红绿蓝三种颜色矩阵,其与I元素的关系是I=O+Ri+Gj+Bk;且UVS都为四元数矩阵所以取前k行或前k列时,如下:

Uk=U(:,[1:k m+1:m+k 2*m+1:2*m+k 3*m+1:3*m+k]);

Vk=V(:,[1:k n+1:n+k 2*n+1:2*n+k 3*n+1:3*n+k]);

Sk=[S(1:k,1:k) zeros(k,k) zeros(k,k) zeros(k,k)];

最后组成新的压缩图片的数据矩阵Ik,显示压缩图片。

 

代码:

I=imread('D:tets.jpg');  %图片是彩色图片  tets.jpg

% I=rgb2gray(I);%灰度化矩阵

% I=im2double(I1);

R=I(:,:,1);%红色

G=I(:,:,2);%绿色

B=I(:,:,3);%蓝色

R=double(R); G=double(G); B=double(B);%转换存储类型为浮点型

[m,n]=size(R);

O=zeros(m,n);

A=[O G R B];

[U S V]=svdQ(A);%svd奇异分解

for k=1:35

    Uk=U(:,[1:k m+1:m+k 2*m+1:2*m+k 3*m+1:3*m+k]);

    Vk=V(:,[1:k n+1:n+k 2*n+1:2*n+k 3*n+1:3*n+k]);

    Sk=[S(1:k,1:k) zeros(k,k) zeros(k,k) zeros(k,k)];

    Ak=timesQ(timesQ(Uk,Sk),transQ(Vk));%U的前k列,S的前k行,前k列,V的前k

    [m,n]=size(Ak);

    n=n/4;

    Rk=Ak(:,2*n+1:3*n);

    Gk=Ak(:,n+1:2*n);

    Bk=Ak(:,3*n+1:4*n);

    Ik(:,:,1)=Rk;%红色

    Ik(:,:,2)=Gk;%绿色

    Ik(:,:,3)=Bk;%蓝色

    figure;  imshow(uint8(Ik));

end

实验结果:


k=1~4时的图片:


k=32~35时的图片