【图像压缩】基于奇异值分解svd进行图像压缩matlab代码

本文介绍了使用奇异值分解(SVD)进行图像压缩的原理和步骤,并通过MATLAB代码展示了实际图像的压缩过程。通过保留最大的奇异值来降低存储需求,同时分析了压缩误差和存储效率。最终,对压缩后的图像进行了展示,证实了方法的有效性。

 1 简介

根据奇异值分解的基本原理及其特点,给出了运用奇异值分解进行图像压缩的方法.通过简单的例子说明了该方法进行图像压缩的基本过程,给出了压缩流程.并通过MAT-LAB编程对实际图像进行处理,表明了该方法的有效性.

2 完整代码

% Read the image into A as a matrix of uint8clcclear allclose all[X,map] = imread('witchhead.jpg');Im = X;% Convert image from uint8 to doubles for svdX = im2double(X);% Seperate [U_r,S_r,V_r] = svd(X(:,:,1));[U_g,S_g,V_g] = svd(X(:,:,2));[U_b,S_b,V_b] = svd(X(:,:,3));%=============================% Test Scripts%=============================%confirmation checking for redout_red = U_r*S_r*V_r';red = X(:,:,1);%-----------------------------% S_r has size 640x1138, thus 640 diagonal valuessize(S_r)% Find the largest k singular valuesk = 30;redk = zeros(k,1);greenk = zeros(k,1);bluek = zeros(k,1);% Discovered that the diagonal of the sum matrix is in orderfor i = 1:k    redk(i) = S_r(i,i);    greenk(i) = S_g(i,i);    bluek(i) = S_b(i,i);end%-----------------------------% Storage AnalysisinitialStorage = 640*1138;currentStorage = (640+1138)*k+k;%-----------------------------% Error Analysissume = 0;for i = 1:640    sume = sume + S_r(i,i) + S_g(i,i) + S_b(i,i);enderror = sum(redk+greenk+bluek) / sume;%-----------------------------NewImage_r = zeros(640,1138);NewImage_g = zeros(640,1138);NewImage_b = zeros(640,1138);for i = 1:k    NewImage_r = NewImage_r + redk(i)* U_r(:,i)*V_r(:,i)';    NewImage_g = NewImage_g + greenk(i) * U_g(:,i)*V_g(:,i)';    NewImage_b = NewImage_b + bluek(i) * U_b(:,i)*V_b(:,i)';end%-----------------------------% Normalize the matrices to fit the rgb formatfor i = 1:640    for j = 1:1138        if(NewImage_r(i,j) < 0)            NewImage_r(i,j) = 0;        end        if(NewImage_g(i,j) < 0)            NewImage_g(i,j) = 0;        end        if(NewImage_b(i,j) < 0)            NewImage_b(i,j) = 0;        end    endend%-----------------------------rgbImage = cat(3, NewImage_r, NewImage_g, NewImage_b);% image(rgbImage);% image(X);difference = rgbImasge-Xfiguresubplot(121)imshow(X,[]);title('原图')subplot(122)imshow(NewImage_b,[]);title('压缩后的图')%-----------------------------

3 仿真结果

4 参考文献

[1]胡乡峰, 卫金茂. 基于奇异值分解(SVD)的图像压缩[J]. 东北师大学报:自然科学版, 2006, 38(3):4.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

### C# 中实现矩阵奇异值分解SVD) 在 C# 中实现矩阵奇异值分解SVD),可以借助现有的数学库,例如 Math.NET Numerics 或者 Extreme Optimization Numerical Libraries for .NET。这些库提供了高效的数值计算功能,并且基于 LAPACK 等底层优化算法[^1]。 以下是使用 Math.NET Numerics 实现 SVD 的示例代码: ```csharp using System; using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra.Double; class Program { static void Main() { // 定义一个矩阵 Matrix<double> matrix = DenseMatrix.OfArray(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }); // 执行奇异值分解 var svd = matrix.Svd(); // 输出结果 Console.WriteLine("U Matrix:"); Console.WriteLine(svd.U); Console.WriteLine("Singular Values:"); Console.WriteLine(svd.S); Console.WriteLine("V Matrix:"); Console.WriteLine(svd.VT); } } ``` #### 解释 1. **Math.NET Numerics** 是一个开源的数学库,支持线性代数、统计学和其他数值计算功能。它内部实现了 LAPACK 和 BLAS 的绑定,因此性能较高[^1]。 2. 在上述代码中,`matrix.Svd()` 方法返回一个包含 U、Σ 和 V^T 的对象,分别对应于 SVD 分解中的左奇异向量矩阵奇异值对角矩阵和右奇异向量矩阵[^1]。 如果需要从头实现 SVD,可以参考以下伪代码逻辑: 1. 计算矩阵 \( A^T A \) 和 \( A A^T \)。 2. 对 \( A^T A \) 和 \( A A^T \) 进行特征值分解(EVD)。 3. 提取特征值平方根作为奇异值,并构造奇异值矩阵 \( \Sigma \)。 4. 构造左奇异向量矩阵 \( U \) 和右奇异向量矩阵 \( V \)[^1]。 然而,手动实现 SVD 的效率通常较低,建议优先使用成熟的库。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值