【问题标题】:Using eigenvalues and eigenvector to compress an image使用特征值和特征向量压缩图像
【发布时间】:2019-08-22 21:56:19
【问题描述】:

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

这里有一些代码可以查看我已经尝试过的内容,但是在尝试计算 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) 调用它并且没有得到预期的结果。我也只将它用于黑白图像。

【问题讨论】:

  • @CrisLuengo 你赌错了!不是,我认为A 矩阵是image_matrix 的良好均值矩阵。
  • 是的,我正在显示诸如 imshow(uint8(A_k)); 之类的图像,我正在使用每行与行的平均值之间的减法来更新每一行,因为这也是算法的样子我尝试删除它,但仍然没有
  • 两件事:1:您没有使用特征值S。 2:您保留最小特征值的特征向量。八度帮助说特征值没有排序,但我看到这些从小到大排序。
  • 你应该使用imshow(A_k,[])显示。
  • @CrisLuengo 有序特征值有什么意义,我该怎么办?我也这样显示它,它不再是空白的,但它也不是正确的图像

标签: image compression octave eigenvalue


【解决方案1】:

您要做的是找到图像相关矩阵的显着模式,即具有最大特征值的模式。一般来说,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 x 41 的网格上。如果您绘制 diag(L),您会注意到 fitst 30 左右的(无序)特征值接近于零,这意味着它们对应的信息非常非常少。所有动作都在最后几种模式下。重新排序后,这些成为前几个模式。

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 2019-04-16
    • 2012-12-05
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多