?? svd_cprs2.m
字號:
% 該程序是用矩陣的起奇異值分解實(shí)現(xiàn)對圖像的壓縮編碼
% 程序中在用奇異值分解之前先將圖像分解成M*M個(gè)小圖像,以增加壓縮效率
% 程序中為了直接對小圖像用奇異值分解,先將N*N的矩陣轉(zhuǎn)換成K.^2*M.^2維的矩陣
% N為讀入圖像矩陣的維數(shù),本程序只能對N*N的圖像進(jìn)行處理
% M.^2為小圖像個(gè)數(shù),K.^2為每個(gè)小圖像所含的像素個(gè)數(shù)
% Iav為小圖像像素的均值,Is為經(jīng)過變換后應(yīng)存儲(chǔ)的數(shù)據(jù),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
%-------------轉(zhuǎn)換矩陣----------------------------------
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';
%-----------求協(xié)方差矩陣-------------
[u,s,v]=svd(A);
%--------奇異值分解-----------
for i=1:K.^2
if i<=8
%-----------設(shè)定壓縮比----------
T(:,i)=u(:,i);
else
break;
end
end
Is=T'*I1;
%---------壓縮數(shù)據(jù)------------------
%-----下面為恢復(fù)數(shù)據(jù)的過程----------
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);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -