使用特征值和特征向量压缩图像

Using eigenvalues and eigenvector to compress an image

我想使用特征值和特征向量压缩图像,因为我已经使用奇异值分解完成了它,但是我在尝试使用特征值和特征向量压缩它时做错了。

这里有一些代码可以查看我已经尝试过的内容,但是在尝试计算 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 应该从上面给我矩阵 A 的近似值,但它只给出了一个空白图像。上面的代码接收:图像的路径和数字 k 这样 k 是某种近似顺序...我使用 ('path/to/image', 2) 调用它并且没有得到预期结果。此外,我仅将其用于 黑白 图像。

您要做的是找到图像相关矩阵的重要模式,即具有最大特征值的模式。一般来说,eig returns eigenvalues/vectors 是随机排列的,@CrisLuengo 告诉你在扔掉 eigenvalues/modes 之前,你需要先对 eig returns 的结果进行排序,就像我有的那样在此脚本中完成;

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 x 41 网格上。如果绘制 diag(L),您会注意到(无序的)特征值最合适的 30 个接近于零,这意味着它们对应的信息非常非常少。所有动作都在最后几种模式中。重新排序后,这些成为前几个模式。