使用特征值和特征向量压缩图像
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 个接近于零,这意味着它们对应的信息非常非常少。所有动作都在最后几种模式中。重新排序后,这些成为前几个模式。
我想使用特征值和特征向量压缩图像,因为我已经使用奇异值分解完成了它,但是我在尝试使用特征值和特征向量压缩它时做错了。
这里有一些代码可以查看我已经尝试过的内容,但是在尝试计算 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 个接近于零,这意味着它们对应的信息非常非常少。所有动作都在最后几种模式中。重新排序后,这些成为前几个模式。