Найти изображение SVD без использования команды SVD

Мой вопрос довольно прост, но я новичок в анализе 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


person MariaS    schedule 01.05.2014    source источник
comment
Я почти уверен, что вам не нужно делать шаги Z2 и Z1. Если вы хотите выполнить реконструкцию изображения, вы можете просто использовать само изображение без каких-либо изменений. Если вы хотите убрать шум с изображения, вам просто нужно изменить сами сингулярные значения. Проверьте эту ссылку: math.gmu.edu/~sap/U09 /m203/СВД/svd.html   -  person rayryeng    schedule 01.05.2014
comment
Спасибо за ответ. Пока моя цель просто разложить изображение на U S и V матрицы SVD без использования SVD в matlab... подскажите, что я делаю не так.   -  person MariaS    schedule 01.05.2014
comment
Очевидно, вы пытаетесь реализовать SVD, используя собственную декомпозицию. Это вполне возможно, но численно это довольно странный подход, так как обычно СВД считается более простой и общей операцией. Что касается функций Matlab, svd реализовано с использованием QR-разложения. Для получения дополнительной информации см. en.wikipedia.org/wiki/.   -  person A. Donda    schedule 01.05.2014
comment
Как это возможно, используя собственное разложение .. пожалуйста, помогите мне с этим   -  person MariaS    schedule 01.05.2014


Ответы (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')));
person MariaS    schedule 02.05.2014