【图像压缩】在 MATLAB 中使用奇异值分解 (SVD) 进行图像压缩(Matlab代码实现)

简介: 【图像压缩】在 MATLAB 中使用奇异值分解 (SVD) 进行图像压缩(Matlab代码实现)

 

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

💥1 概述

在MATLAB中使用奇异值分解(Singular Value Decomposition,SVD)进行图像压缩是一种常见的技术。这种方法利用SVD将原始图像矩阵分解为三个矩阵的乘积,然后通过保留较大的奇异值来近似重构原始图像,从而实现图像的压缩。 对于一幅图像,将其表示为一个矩阵,其中每个元素表示图像的像素值。 使用SVD将图像矩阵分解为三个矩阵的乘积,然后通过截断奇异值来近似重构原始图像。 保留较大的奇异值,减少较小的奇异值,从而减少存储空间并实现图像压缩。 压缩比例是指压缩后图像的大小与原始图像大小之间的比率。 可以根据应用需求和图像质量要求选择不同的压缩比例。

在MATLAB中使用奇异值分解(SVD)进行图像压缩的研究

摘要

奇异值分解(SVD)是一种强大的矩阵分解技术,在图像压缩中具有独特优势。通过将图像矩阵分解为三个矩阵的乘积,并保留较大的奇异值,可以实现图像数据的有效压缩。本文详细介绍了基于SVD的图像压缩算法的原理、步骤、MATLAB实现及实验结果分析。

1. 引言

图像压缩是图像处理中的关键技术,旨在减少图像文件的大小,便于存储和传输。图像压缩算法主要分为有损压缩和无损压缩两大类。有损压缩算法可以获得更高的压缩比,但会损失部分图像信息;无损压缩算法则可以保证图像信息不丢失,但压缩比相对较低。奇异值分解(SVD)作为一种有损压缩方法,通过保留图像矩阵的主要信息来实现压缩,具有压缩率高、图像质量好等优点。

2. SVD基本原理

奇异值分解(SVD)是一种将矩阵分解为三个矩阵乘积的方法。对于一个m×n的矩阵A,其SVD分解形式为:

image.gif 编辑

3. 基于SVD的图像压缩算法

基于SVD的图像压缩算法主要分为以下几个步骤:

  1. 图像转换:将图像转换为灰度图像(如果是彩色图像)。
  2. 矩阵表示:将灰度图像表示为一个矩阵A,其中每个元素代表图像中对应像素点的灰度值。
  3. SVD分解:对矩阵A进行SVD分解,得到U、Σ和V三个矩阵。
  4. 压缩Σ矩阵:保留Σ矩阵中的前k个奇异值,并将其余奇异值设置为0,得到压缩后的Σk矩阵。
  5. 重建图像:根据压缩后的Σk矩阵以及矩阵U和V的前k列,重新构造图像矩阵Ak=UkΣkVkT。
  6. 图像显示:将重建的图像矩阵Ak转换为图像并显示。

4. MATLAB实现

matlab

% 读取图像并转换为灰度图像
originalImage = imread('lena.bmp'); % 替换为你的图像路径
if size(originalImage, 3) == 3
grayImage = rgb2gray(originalImage);
else
grayImage = originalImage;
end
% 将灰度图像转换为矩阵
A = double(grayImage);
% 对矩阵A进行SVD分解
[U, S, V] = svd(A);
% 选择保留的奇异值数量k
k = 50; % 可以根据需要调整k的值
U_k = U(:, 1:k);
S_k = S(1:k, 1:k);
V_k = V(:, 1:k);
% 重建压缩后的图像矩阵
A_k = U_k * S_k * V_k';
% 将图像矩阵转换为图像并显示
compressedImage = uint8(A_k);
% 显示原始图像和压缩后的图像
figure;
subplot(1, 2, 1);
imshow(originalImage);
title('Original Image');
subplot(1, 2, 2);
imshow(compressedImage);
title(['Compressed Image (k = ', num2str(k), ')']);
% 计算压缩比和PSNR(峰值信噪比)
originalSize = numel(A);
compressedSize = numel(U_k) + numel(S_k) + numel(V_k);
compressionRatio = originalSize / compressedSize;
mse = mean((A(:) - A_k(:)).^2);
maxPixel = max(A(:));
psnrValue = 20 * log10(maxPixel / sqrt(mse));
% 显示压缩比和PSNR
fprintf('Compression Ratio: %.2f:1\n', compressionRatio);
fprintf('PSNR: %.2f dB\n', psnrValue);

5. 实验结果与分析

  1. 压缩比:通过调整保留的奇异值数量k,可以控制压缩比。k越小,压缩比越高,但图像质量也会下降。实验结果表明,当k取适当值时,可以在保证图像质量的同时获得较高的压缩比。
  2. 图像质量:使用峰值信噪比(PSNR)来评估压缩后图像的质量。PSNR值越高,表示压缩后图像与原始图像的差异越小,图像质量越好。实验结果表明,随着k的增加,PSNR值也会增加,图像质量逐渐提高。
  3. 可视化效果:通过对比原始图像和压缩后的图像,可以直观地看到压缩效果。当k较小时,压缩后的图像可能会出现模糊或失真现象;当k较大时,压缩后的图像与原始图像几乎无法区分。

6. 结论与展望

基于SVD的图像压缩算法是一种有效的图像有损压缩方法。该算法通过对图像矩阵进行SVD分解,并压缩Σ矩阵来实现图像压缩。实验结果表明,该算法具有压缩率高、图像质量好等优点。然而,该算法也存在计算量大的缺点,尤其是在处理大尺寸图像时。未来工作可以聚焦于以下方向:

  • 优化SVD计算:通过并行计算或近似算法降低SVD分解的时间复杂度。
  • 结合其他技术:将SVD与小波变换、分块处理等技术结合,进一步提升压缩效率。
  • 自适应参数选择:根据图像内容动态调整保留的奇异值数量k,平衡压缩比与图像质量。

📚2 运行结果

image.gif 编辑

image.gif 编辑

image.gif 编辑

主函数部分代码:

% return error
    error(...
    'Incorrect input arg: compr must satisfy 0 <= compr <= number of Singular Values');
% Size of the image
m = size(Lena,1);
n = size(Lena,2);
storage = m*n;
fprintf('Size of image: %d px by %d px, i.e. uses %d px of storage.\n',m,n,storage);
% SVs and reduced storage
r = min([m,n]); % original number of SVs
r_red = length(indices); % to be saved number of SVs
r_max = floor(m*n/(m+n+1)); % maximum to be saved number of SVs for compression
storage_red = m*r_red + n*r_red + r_red;
if compr >= 0 && compr < 1
    % only SVs bigger than compr times biggest SV
    fprintf('The smallest SV chosen to be smaller than %d of the biggest SV.\n',compr);
elseif compr >= 1 && compr <= length(singvals)
    % only the biggest compr SVs
else
    % return error
    fprintf('There was some error before. Analysis cannot continue.\n')
end
fprintf('Out of %d SVs, only %d SVs saved ',r,r_red);
fprintf('(Maximum number of SVs for compression: %d SVs).\n',r_max);
fprintf('Reduced storage: %d px.\n',storage_red);
% Determine made error
error = 1 - sum(singvals(indices))/sum(singvals);
fprintf('Made error: %d.\n',error);
errorImage = Lena_org - Lena_red;
% Entropy

image.gif

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]朱路,邬雷,王定坤,等.基于零值域分解的深度图像压缩感知重建[J/OL].工程科学与技术:1-12[2024-06-06].http://kns.cnki.net/kcms/detail/51.1773.TB.20240604.1700.011.html.

[2]黄梅娟,王永梅.基于尺度特征融合的极低比特率三维复杂图像无损压缩[J/OL].海南热带海洋学院学报:1-9[2024-06-06].http资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取【请看主页然后私信】

相关文章
|
28天前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
28天前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
147 14
|
23天前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
|
23天前
|
机器学习/深度学习 算法 安全
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
102 2
|
23天前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
|
28天前
|
机器学习/深度学习 算法
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
|
28天前
|
机器学习/深度学习 传感器 算法
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
136 5
|
28天前
|
存储 算法 安全
【多目标工程应用】基于MOGWO的地铁隧道上方基坑工程优化设计研究(Matlab代码实现)
【多目标工程应用】基于MOGWO的地铁隧道上方基坑工程优化设计研究(Matlab代码实现)
|
28天前
|
传感器 机器学习/深度学习 编解码
【电缆】中压电缆局部放电的传输模型研究(Matlab代码实现)
【电缆】中压电缆局部放电的传输模型研究(Matlab代码实现)
|
28天前
|
算法 调度 决策智能
【复现】同时考虑考虑孤岛与重构的配电网故障恢复运行策略(Matlab代码实现)
【复现】同时考虑考虑孤岛与重构的配电网故障恢复运行策略(Matlab代码实现)

热门文章

最新文章