我的问题非常简单,但我是SVD分析的新手。我的最终目标是使用SVD实现对图像进行去噪,但此时我正试图理解奇异值分解的概念。
正如标题所示,我想将图像分解为其组件矩阵,但我想避免使用SVD命令,这样我就可以得到过程中实际发生的概念。
代码:
a = double(rgb2gray(imread('Lenna.png')));
a_tp = a';
Z2 = a*a_tp;
Z1 = a_tp*a;
[U,U_val] = eig(Z1);
[V,V_val] = eig(Z2);
Sig = sqrt(U_val+V_val);
figure(1)
Img_new = imshow(((U*Sig*V')));
我认为U
,V
和Sigma
是我的组件U
是a'*a
和V
的特征向量是本征a*a'
和Sigma
的向量是相应的特征值,但这不对......有一些概念错误,请帮帮我
PS>>这是参考教程> http://www.youtube.com/watch?v=BmuRJ5J-cwE
答案 0 :(得分:0)
我明白了。发布代码以供将来参考并帮助他人。
clear all; clc;
a = double(rgb2gray(imread('Lenna.png')));
%a = [1 1 -1;0 1 1;-1 1 1];
[q d r] = svd(a);
a_tp = a';
Z1 = a_tp*a;
[Z1_vec,Z1_val] = eig(Z1);
[k p] = size(a);
[m n] = size(Z1_vec);
[o p] = size(Z1_val);
U = zeros(p,m); % Size of U
for i = 1:1:m
U(:,i) = (a*Z1_vec(:,n))/sqrt(Z1_val(o,p)); % U in SVD
o = o-1; p = p-1;
n = n-1;
end
[o p] = size(Z1_val);
Sigma = sqrt(Z1_val);
Sig= zeros(o,p);
for i=1:1:p
Sig(i,i) = Sigma(o-i+1,p-i+1); % Diagnol matix
end
V = fliplr(Z1_vec); % r in SVD
figure(1)
Img_new = imshow((mat2gray(U*Sig*V')));
figure(2)
Img_svd = imshow((mat2gray(q*d*r')));