我是 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,双级)?假设我只想取前 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
显然有一些错误,因为我没有得到多张图片或知道如何“绘制”错误矩阵