16074303 作业7 实训3 图片压缩
作者:黄彩双 发布时间:2019-05-21 19:11:17 浏览次数:165
1. 问题:通过SVD分解,压缩图像。
(1)灰色图片的压缩
(2)彩色图片的压缩
1)灰度图像压缩
分析:
灰色图片压缩,通过imread()读入图片数据I;
转换图片数据存储类型为浮点型;
通过SVD分解矩阵,分解出U,S,V,三个矩阵, [U S V]=svd(I);%svd奇异分解;
矩阵I=U*S*V’,取U和V的前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为四元数矩阵,R,G,B分别表示红绿蓝三种颜色矩阵,其与I元素的关系是I=O+Ri+Gj+Bk;且U、V、S都为四元数矩阵所以取前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时的图片