gpt4 book ai didi

matlab - 在 MATLAB 中使用 SVD 压缩图像

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:42 26 4
gpt4 key购买 nike

我是 MATLAB 的新手,但我正在尝试为灰度图像做一些图像压缩代码。

问题

如何使用 SVD 去除低值特征值以重建压缩图像?

到目前为止的工作/尝试

到目前为止我的代码是:

B=imread('images1.jpeg');   
B=rgb2gray(B);
doubleB=double(B);
%read the image and store it as matrix B, convert the image to a grayscale
photo and convert the matrix to a class 'double' for values 0-255
[U,S,V]=svd(doubleB);

这使我能够使用存储在变量 S 中的特征值成功分解图像矩阵。

如何截断 S(167x301, double 类)?假设我只想取前 100 个(或任何 n 个)的 167 个特征值,我该怎么做并重建压缩图像?

更新的代码/想法

我没有在评论部分放一堆代码,这是我目前的草稿。我已经能够通过手动更改 N 成功创建压缩图像,但我想再做两件事:

1- 显示一组用于各种压缩的图像(即,为 N = 5、10、25 等运行一个循环)

2- 以某种方式计算每个图像与原始图像之间的差异(误差)并将其绘制成图表。

我对循环和输出的理解很糟糕,但这是我尝试过的:

B=imread('images1.jpeg');  
B=rgb2gray(B);
doubleB=im2double(B);%
%read the image and store it as matrix B, convert the image to a grayscale
%photo and convert the image to a class 'double'
[U,S,V]=svd(doubleB);
C=S;
for N=[5,10,25,50,100]
C(N+1:end,:)=0;
C(:,N+1:end)=0;
D=U*C*V';
%Use singular value decomposition on the image doubleB, create a new matrix
%C (for Compression diagonal) and zero out all entries above N, (which in
%this case is 100). Then construct a new image, D, by using the new
%diagonal matrix C.
imshow(D);
error=C-D;
end

显然有一些错误,因为我没有得到多张图片或者不知道如何“绘制”错误矩阵

最佳答案

虽然这个问题很老,但是对我理解SVD帮助很大。我已经修改了您在问题中编写的代码以使其工作。

我相信您可能已经解决了这个问题,但是为了将来访问此页面的任何人引用,我在此处包含了完整的代码以及输出图像和图表。

代码如下:

close all
clear all
clc

%reading and converting the image
inImage=imread('fruits.jpg');
inImage=rgb2gray(inImage);
inImageD=double(inImage);

% decomposing the image using singular value decomposition
[U,S,V]=svd(inImageD);

% Using different number of singular values (diagonal of S) to compress and
% reconstruct the image
dispEr = [];
numSVals = [];
for N=5:25:300
% store the singular values in a temporary var
C = S;

% discard the diagonal values not required for compression
C(N+1:end,:)=0;
C(:,N+1:end)=0;

% Construct an Image using the selected singular values
D=U*C*V';


% display and compute error
figure;
buffer = sprintf('Image output using %d singular values', N)
imshow(uint8(D));
title(buffer);
error=sum(sum((inImageD-D).^2));

% store vals for display
dispEr = [dispEr; error];
numSVals = [numSVals; N];
end

% dislay the error graph
figure;
title('Error in compression');
plot(numSVals, dispEr);
grid on
xlabel('Number of Singular Values used');
ylabel('Error between compress and original image');

将其应用于下图: Original Image

仅使用前 5 个奇异值给出以下结果,

First 5 Singular Values

前 30 个奇异值,

First 30 Singular Values

和前 55 个奇异值,

First 55 Singular Values

误差随着奇异值数量的增加而变化,如下图所示。

Error graph

在这里您可以注意到图表显示使用大约 200 个第一个奇异值产生大约零误差。

关于matlab - 在 MATLAB 中使用 SVD 压缩图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com