✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,
代码获取、论文复现及科研仿真合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab完整代码及仿真定制内容点击👇
🔥 内容介绍
摘要
本文介绍了一种基于奇异值分解(SVD)的图像压缩方法。SVD是一种矩阵分解技术,可以将矩阵分解为三个矩阵的乘积:左奇异矩阵、奇异值矩阵和右奇异矩阵。奇异值矩阵是对角矩阵,其对角元素称为奇异值。奇异值的大小反映了矩阵中各列向量的相对重要性。
SVD可以用于图像压缩,因为图像可以表示为一个矩阵。图像的像素值构成了矩阵的元素。SVD可以将图像矩阵分解为三个矩阵的乘积。左奇异矩阵和右奇异矩阵是正交矩阵,奇异值矩阵是对角矩阵。奇异值矩阵的对角元素反映了图像中各列向量的相对重要性。
图像压缩可以通过截断奇异值矩阵来实现。截断奇异值矩阵意味着将奇异值矩阵中较小的奇异值设置为0。这将导致图像矩阵的秩降低,从而减少图像的大小。
SVD图像压缩算法
SVD图像压缩算法的步骤如下:
-
将图像转换为矩阵。
-
对图像矩阵进行SVD分解。
-
截断奇异值矩阵。
-
将截断后的奇异值矩阵与左奇异矩阵和右奇异矩阵相乘,得到压缩后的图像矩阵。
-
将压缩后的图像矩阵转换为图像。
SVD图像压缩算法的优点
SVD图像压缩算法具有以下优点:
-
压缩率高。SVD图像压缩算法可以将图像压缩到很小的尺寸,而不会明显降低图像质量。
-
图像质量好。SVD图像压缩算法不会引入明显的伪影,因此压缩后的图像质量很好。
-
算法简单。SVD图像压缩算法的实现非常简单,只需要几个简单的步骤即可完成。
📣 部分代码
clear all
clc
k = 1:10:101; %保留的奇异值数组
n = length(k); %保留的奇异值数组大小
compress_ratio = zeros(1,n); %构造压缩比数组
I = imread('ant.jpg');
figure();
imshow(I);
title('原图像');
for i = 1:n
%自定义奇异值压缩函数SVD_Compression,进行奇异值压缩
[img,D,ratio] = SVD_Compression(k(i),I);
compress_ratio(i) = ratio;
figure();
imshow(img);
title_str = ['保留前',int2str(k(i)),'奇异值的图像'];
title(title_str)
end
disp("直接对原图像进行压缩的压缩比:");
disp(compress_ratio);
%绘制奇异值的分布曲线
figure();
plot(diag(D),'b-','LineWidth',3);
title('输入原图像矩阵的奇异值分布');
ylabel('奇异值大小');
xlabel('奇异值所在奇异值矩阵D中的位置');
%绘制绘制奇异值个数与压缩比的关系曲线
figure();
plot(k,compress_ratio,'b-','LineWidth',3);
title('直接对原图像进行压缩的奇异值个数与压缩比的关系');
xlabel('奇异值个数');
ylabel('压缩比');
⛳️ 运行结果
SVD图像压缩算法的缺点
SVD图像压缩算法也存在一些缺点:
-
计算量大。SVD图像压缩算法的计算量很大,尤其是对于大尺寸图像。
-
存储空间大。SVD图像压缩算法需要存储三个矩阵,因此存储空间很大。
结论
SVD图像压缩算法是一种有效的图像压缩方法。SVD图像压缩算法具有压缩率高、图像质量好、算法简单的优点。但是,SVD图像压缩算法也存在计算量大、存储空间大的缺点。
🔗 参考文献
[1] 曾超,张卫东,徐永利.基于奇异值分解的图像压缩及其Matlab实现[J].科技信息, 2010(14):484-484.DOI:10.3969/j.issn.1001-9960.2010.14.412.
[2] 张成楠.基于奇异值分解图像压缩算法的研究[J].山西电子技术, 2010(4):2.DOI:CNKI:SUN:SXDS.0.2010-04-032.