【图像压缩】在 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资源获取【请看主页然后私信】

相关文章
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
409 0
|
3月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
187 0
|
3月前
|
算法 机器人 计算机视觉
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
153 0
|
3月前
|
新能源 Java Go
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
155 0
|
3月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
221 8
|
3月前
|
机器学习/深度学习 编解码 算法
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
233 8
|
3月前
|
机器学习/深度学习 数据采集 测试技术
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
141 8
|
3月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
237 8
|
3月前
|
编解码 运维 算法
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
220 12
|
3月前
|
人工智能 数据可视化 网络性能优化
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
171 9

热门文章

最新文章