奇異值分解在影象壓縮中的應用(有MATLAB模擬程式)
這篇文章其實也是矩陣分析課程的一個作業,當時也是覺得矩陣奇異值分解挺有意思的,所以就在網上查詢奇異值分解的相關應用。另外自己對影象處理也很感興趣,因此就選擇了影象壓縮這個應用。寫部落格是個很好的學習方法,堅持寫部落格也是一個好習慣。下面就直接把論文貼上來。
附錄1:奇異值分解幾何意義程式
t=[0:0.01:2*pi];
x=cos(t);
y=sin(t);
%變換矩陣
A = [1 -2;1 2];
A = double(A);
%對A進行奇異值分解
[U S V] = svd(A)
s = svd(A);
%第一個分力
S1 = [s(1) 0;0 0];
A1 = U*S1*V'
%第二個分力
S2 = [0 0; 0 s(2)];
A2 =U*S2*V'
%畫單位圓
subplot(2,2,1);
plot(x,y)
title('單位圓')
axis equal;
xlabel('圖1(a)')
%畫單位圓經過矩陣A變換的影象
a=A*[x;y];
x1=a(1,:);
y1=a(2,:);
subplot(2,2,2);
plot(x1,y1)
title('單位圓經過矩陣 A 變換後的圖形')
xlabel('圖1(b)')
axis equal;
%畫單位圓經過矩陣A1變換的影象
a1=A1*[x;y];
x2=a1(1,:);
y2=a1(2,:);
subplot(2,2,3);
plot(x2,y2)
title('單位圓經過矩陣 A1 變換後的圖形')
xlabel('圖1(c)')
axis equal;
%畫單位圓經過矩陣A2變換的影象
a2=A2*[x;y];
x3=a2(1,:);
y3=a2(2,:);
subplot(2,2,4);
plot(x3,y3)
title('單位圓經過矩陣 A2 變換後的圖形')
xlabel('圖1(d)')
axis equal;
附錄2:奇異值分解影象壓縮程式
clear all;
a=imread('lena.png');
a=double(a);
[U S V]=svd(a);
s = svd(a);
figure;
plot(s,'*');
figure;
re=U(:,1:10)*S(1:10,1:10)*V(:,1:10)';
subplot(2,3,1);
imshow(mat2gray(re));
title('k = 10')
xlabel('圖3(a)')
axis equal;
re=U(:,1:50)*S(1:50,1:50)*V(:,1:50)';
subplot(2,3,2);
imshow(mat2gray(re));
title('k = 50')
xlabel('圖3(b)')
axis equal;
re=U(:,1:200)*S(1:200,1:200)*V(:,1:200)';
subplot(2,3,3);
imshow(mat2gray(re));
title('k = 100')
xlabel('圖3(c)')
axis equal;
re=U(:,1:300)*S(1:300,1:300)*V(:,1:300)';
subplot(2,3,4);
imshow(mat2gray(re));
title('k = 200')
xlabel('圖3(d)')
axis equal;
re=U(:,1:400)*S(1:400,1:400)*V(:,1:400)';
subplot(2,3,5);
imshow(mat2gray(re));
title('k =300')
xlabel('圖3(e)')
axis equal;
re=U(:,1:512)*S(1:512,1:512)*V(:,1:512)';
subplot(2,3,6);
imshow(mat2gray(re));
title('k = 512')
xlabel('圖3(f)')
axis equal;