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

问题描述 投票:0回答:1

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

这里有一些代码可以看到我已经尝试过但在尝试计算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)称它并没有得到预期的结果。我也只在黑白图像中使用它。

image compression octave eigenvalue
1个回答
1
投票

您要做的是找到图像的相关矩阵的重要模式,即具有最大特征值的模式。一般来说,eig以随机顺序返回特征值/向量,@ ChrisLuengo告诉你,在抛出特征值/模式之前,你需要首先按照我在这个脚本中所做的那样对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左右接近零,这意味着它们对应于非常非常少的信息。所有动作都在最后几种模式中。重新订购后,这些成为前几种模式。

© www.soinside.com 2019 - 2024. All rights reserved.