【问题标题】:Find Image SVD without using SVD command在不使用 SVD 命令的情况下查找图像 SVD
【发布时间】:2014-05-01 13:51:45
【问题描述】:

我的问题很简单,但我是 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')));

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

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

【问题讨论】:

  • 我很确定您不需要执行 Z2 和 Z1 步骤。如果你想进行图像重建,你可以直接使用图像本身而不做任何修改。如果要对图像进行去噪,只需修改奇异值本身即可。查看此链接:math.gmu.edu/~sap/U09/m203/SVD/svd.html
  • 感谢您的回复。现在我的目标只是将图像分解为 SVD 的 U S 和 V 矩阵,而不在 matlab 中使用 SVD ...告诉我我做错了什么。
  • 您显然是在尝试使用特征分解来实现 SVD。这显然是可能的,但在数值上这是一种相当奇怪的方法,因为通常 SVD 被认为是更简单和更通用的操作。关于 Matlab 函数,svd 是使用 QR 分解实现的。有关详细信息,请参阅en.wikipedia.org/wiki/…
  • 如何使用特征分解..请帮助我

标签: matlab noise svd eigenvector eigenvalue


【解决方案1】:

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

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')));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 2012-11-16
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2020-10-31
    • 2015-11-15
    • 2016-12-17
    相关资源
    最近更新 更多