这篇文章其实也是矩阵分析课程的一个作业,当时也是觉得矩阵奇异值分解挺有意思的,所以就在网上查找奇异值分解的相关应用。另外自己对图像处理也很感兴趣,因此就选择了图像压缩这个应用。写博客是个很好的学习方法,坚持写博客也是一个好习惯。下面就直接把论文贴上来。
附录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;
|
请发表评论