奇异值分解在图像压缩中的应用(有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;








你可能感兴趣的:(图像压缩,奇异值分解)