Использование собственных значений и собственного вектора для сжатия изображения - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу сжать изображение, используя собственные значения и собственный вектор, поскольку я уже сделал это, используя разложение по сингулярным значениям, но я делаю что-то не так, пытаясь сжать его, используя собственные значения и собственные векторы.

Вот некоторый код дляпосмотрите, что я уже пробовал, но что-то идет не так при попытке вычислить матрицу Z.

  image_matrix = double(imread(image));
  [m n] = size(image_matrix);
  miu = zeros(m, 1);
  A = [];
  for i = 1 : m
    miu(i) = mean(image_matrix(i, :));
    A(i, :) = image_matrix(i, :) - miu(i);
  endfor

  Z = A*A'/(n - 1);
  [V S] = eig(Z);

  W = V(:, 1 : k);
  Y = W'*A;
  A_k = W*Y + miu;

W*Y+miu должен был дать мне приближение матрицы А из приведенного выше, но это просто даетпустое изображение.Приведенный выше код получает: путь к изображению и число k, такое, что k является своего рода порядком приближения ... Я называю это с помощью ('path/to/image', 2) и не получаю ожидаемого результата.Также я использую это только для черно-белых изображений.

1 Ответ

1 голос
/ 02 апреля 2019

То, что вы пытаетесь сделать, - это найти значимые режимы корреляционной матрицы вашего изображения, то есть режимы, которые имеют наибольшие собственные значения.В общем, eig возвращает собственные значения / векторы в случайном порядке, @CrisLuengo сообщает, что перед тем, как выбросить собственные значения / моды, вам нужно сначала упорядочить результаты, которые eig возвращает, как я сделал в этом сценарии;

clear;clf
tx = ty = linspace (-8, 8, 41)';
[xx, yy] = meshgrid (tx, ty);
r = sqrt (xx .^ 2 + yy .^ 2) + eps;
tz = sin (r) ./ r;
%mesh (tx, ty, tz);
Z=tz*transpose(tz);
[vec,L]=eig(Z);
lambda=diag(L);
[lambda,order]=sort(lambda,'descend');
vec=vec(:,order);
%%plot(lambda);hold on;plot(diag(L))
%% reconstruct with 5 largest modes:
neof=5;
shortz=tz*vec(:,1:5)*transpose(vec(:,1:5));
mesh (tx, ty, shortz);

Изображение является sin (r) / r, на сетке 41 на 41.Если вы построите diag (L), собственные (не упорядоченные) собственные значения вы заметите, что наиболее подходящие 30 или около того близки к нулю, что означает, что они соответствуют очень, очень маленькой информации.Все действие происходит в нескольких последних режимах.После повторного заказа они становятся первыми несколькими режимами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...