首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用SVD命令查找图像SVD

不使用SVD命令查找图像SVD
EN

Stack Overflow用户
提问于 2014-05-01 21:51:46
回答 1查看 1.2K关注 0票数 0

我的问题很简单,但我是SVD分析的新手。我的最终目标将是使用SVD实现去噪图像,但目前我正在尝试理解奇异值分解的概念。

正如标题所暗示的,我希望将图像分解为其分量矩阵,但我希望避免使用SVD命令,这样我就可以了解该过程中实际发生了什么。

代码:

代码语言:javascript
复制
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')));

我认为UVSigma是我的组件,因为Ua'*a的特征向量,Va*a'的特征向量,Sigma是相应的特征值,但这是不对的……有一些概念上的错误,请帮帮我

PS >>这是参考教程> http://www.youtube.com/watch?v=BmuRJ5J-cwE

EN

回答 1

Stack Overflow用户

发布于 2014-05-02 18:46:33

我想通了。发布代码以供将来参考,并帮助他人。

代码语言:javascript
复制
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')));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23409070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档