📄 svd_cprs2.m
字号:
% 该程序是用矩阵的起奇异值分解实现对图像的压缩编码
% 程序中在用奇异值分解之前先将图像分解成M*M个小图像,以增加压缩效率
% 程序中为了直接对小图像用奇异值分解,先将N*N的矩阵转换成K.^2*M.^2维的矩阵
% N为读入图像矩阵的维数,本程序只能对N*N的图像进行处理
% M.^2为小图像个数,K.^2为每个小图像所含的像素个数
% Iav为小图像像素的均值,Is为经过变换后应存储的数据,T为特征向量图像
clear all
close all
Img=imread('1','jpg');
%----读入灰度图像----------------
Gi=Img;
Gi1=Gi;
Gi=double(Gi);
Gi2=zeros(size(Gi1));
N=size(Gi1,1);
K=8;
M=N/K;
I=zeros(K.^2,M.^2);
%----------------------------------------------
for i=1:K.^2
for j=1:M.^2
I(i,j)=Gi(fix((i-1)/K)+(fix((j-1)/M))*K+1,mod(i-1,K)+(mod(j-1,M))*K+1);
end
end
%-------------转换矩阵----------------------------------
Iav=zeros(1,M.^2);
for m=1:M.^2
for n=1:K.^2
Iav(1,m)=Iav(1,m)+I(n,m);
end
end
Iav=Iav./(K.^2);
%-----------求小图像像素均值---------
I1=I;
for l=1:M.^2
I1(:,l)=I1(:,l)-Iav(1,l);
end
A=I1*I1';
%-----------求协方差矩阵-------------
[u,s,v]=svd(A);
%--------奇异值分解-----------
for i=1:K.^2
if i<=8
%-----------设定压缩比----------
T(:,i)=u(:,i);
else
break;
end
end
Is=T'*I1;
%---------压缩数据------------------
%-----下面为恢复数据的过程----------
I2=T*Is;
for l=1:M.^2
I2(:,l)=I2(:,l)+Iav(1,l);
end
for i=1:K.^2
for j=1:M.^2
Gi2(fix((i-1)/K)+(fix((j-1)/M))*K+1,mod(i-1,K)+(mod(j-1,M))*K+1)=I2(i,j);
end
end
Gi2=uint8(Gi2);
%---------画出解压前后图像比较效果-----------------
subplot(1,2,1),imshow(Gi1);
subplot(1,2,2),imshow(Gi2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -