1. 程式人生 > >奇異值分解在影象壓縮中的應用(有MATLAB模擬程式)

奇異值分解在影象壓縮中的應用(有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;