SVD进行图像压缩案例

2023-05-16

理论部分参考这篇文章,写的非常好。

本文主要是直观感受一下SVD对图像进行压缩的作用。案例图片如下(PS:图片为华山,拍摄于2023/4/29)
在这里插入图片描述
1、首先需要将上述图片转换为矩阵,利用imread命令;

img = imread('1.jpg')

2、我们需要对其进行分解为R,G,B三个矩阵,上述三个矩阵的大小都是 6000 × 8000 6000\times8000 6000×8000的,还是比较大的。

%分解RGB三原色
R = im2double(img(:,:,1));
G = im2double(img(:,:,2));
B = im2double(img(:,:,3));

3、然后对每个矩阵进行SVD分解

%对每个矩阵进行SVD分解
[UR,SR,VR ] = svd(R);
[UG,SG,VG ] = svd(G);
[UB,SB,VB ] = svd(B);

4、提取前K个奇异值,重新组装彩图矩阵

K=1;%前5个奇异值
URK=UR(:,1:K);SRK=SR(1:K,1:K);VRK=VR(:,1:K);
RK=URK*SRK*VRK';
%%
UGK=UG(:,1:K);SGK=SG(1:K,1:K);VGK=VG(:,1:K);
GK=UGK*SGK*VGK';
%%
UBK=UB(:,1:K);SBK=SB(1:K,1:K);VBK=VB(:,1:K);
BK=UBK*SBK*VBK';
%%组装压缩后的RBG矩阵
img_svd = zeros(6000,8000,3);
img_svd(:,:,1) = RK;img_svd(:,:,2) = GK;img_svd(:,:,3) = BK;

虽然上述彩图矩阵的大小依然是 6000 × 8000 × 3 6000\times 8000\times3 6000×8000×3,但是其是由6个比较小的矩阵合成的,以R矩阵为例,其原始大小为 6000 × 8000 6000\times8000 6000×8000,经过svd分解后,取前1个奇异值时,组成RK的三个矩阵为 6000 × 1 , 1 × 1 , 8000 × 1 6000\times1,1\times1,8000\times1 6000×1,1×1,8000×1;直接变成了原来的 6000 × 8000 / ( 6000 + 8000 + 1 ) = 3428 6000\times8000/(6000+8000+1) = 3428 6000×8000/(6000+8000+1)=3428分之1。
5、最后让我们来看一下压缩后的图片与原始图片的对比

% 显示图像
figure;
subplot(1,2,1),imshow(img),title('原始图像')
subplot(1,2,2),imshow(img_svd),title('压缩图像')

sgtitle(strcat(['取前',num2str(K),'个奇异值']))

1)K= 1时
在这里插入图片描述
2)K= 10时
在这里插入图片描述
3)K= 100时
在这里插入图片描述
可以看出,随着所取的奇异值的个数增加,图片越来越接近原始图片,K=100时,已经非常接近,但是数据量却十分的小,仅是原始图片的1/7。由此可以看出SVD压缩图片的威力。

附上完整代码如下:

% 读入PNG图像
img = imread('1.jpg');

%分解RGB三原色
R = im2double(img(:,:,1));
G = im2double(img(:,:,2));
B = im2double(img(:,:,3));

%对每个矩阵进行SVD分解
[UR,SR,VR ] = svd(R);
[UG,SG,VG ] = svd(G);
[UB,SB,VB ] = svd(B);
%%
K=100;%前5个奇异值
URK=UR(:,1:K);SRK=SR(1:K,1:K);VRK=VR(:,1:K);
RK=URK*SRK*VRK';
%%
UGK=UG(:,1:K);SGK=SG(1:K,1:K);VGK=VG(:,1:K);
GK=UGK*SGK*VGK';
%%
UBK=UB(:,1:K);SBK=SB(1:K,1:K);VBK=VB(:,1:K);
BK=UBK*SBK*VBK';
%%组装压缩后的RBG矩阵
img_svd = zeros(6000,8000,3);
img_svd(:,:,1) = RK;img_svd(:,:,2) = GK;img_svd(:,:,3) = BK;
% 显示图像
figure;
subplot(1,2,1),imshow(img),title('原始图像','fontsize',40)
subplot(1,2,2),imshow(img_svd),title('压缩图像','fontsize',40)

sgtitle(strcat(['取前',num2str(K),'个奇异值']),'fontsize',40)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVD进行图像压缩案例 的相关文章

  • SVD进行图像压缩案例

    理论部分参考这篇文章 xff0c 写的非常好 本文主要是直观感受一下SVD对图像进行压缩的作用 案例图片如下 xff08 PS 图片为华山 xff0c 拍摄于2023 4 29 xff09 1 首先需要将上述图片转换为矩阵 xff0c 利用
  • 奇异值分解 (SVD)原理及python实现

    奇异值分解 Singular Value Decomposition SVD 是一种矩阵分解 Matrix Decomposition 的方法 除此之外 矩阵分解还有很多方法 例如特征分解 Eigendecomposition LU分解 L
  • 机器学习:matlab和python实现SVD(奇异值分解)算法

    1 SVD SVD Singular Value Decomposition 奇异值分解 SVD算法不光可以用于降维算法中的特征分解 还可以用于推荐系统 以及自然语言处理等领域 是很多机器学习算法的基石 假设我们现在有一个矩阵M m n 如
  • C++SVD分解求伪逆 (Eigen库)(附C++代码)

    SVD求解矩阵伪逆过程 首先对矩阵A进行SVD分解得到U D V三个矩阵 其中D为列矩阵 是从上到下 由大到小排列的A矩阵的奇异值 若D矩阵中元素个数为n则原矩阵有n个奇异值 构建大小为V cols U cols 的S矩阵 其中S矩阵的前n
  • 机器学习实战之SVD

    1 奇异值分解 SVD singular value decomposition 1 1 SVD评价 优点 简化数据 去除噪声和冗余信息 提高算法的结果 缺点 数据的转换可能难以理解 1 2 SVD应用 1 隐性语义索引 latent se
  • 机器学习实战学习笔记(十三)利用SVD简化数据

    PS 该系列数据都可以在图灵社区 点击此链接 中随书下载中下载 如下 1 SVD的应用 奇异值分解 优点 简化数据 去除噪声 提高算法的结果 缺点 数据的转换可能难以理解 适用数据类型 数值型数据 1 1 隐形语义索引 最早的SVD应用之一
  • 实用常识

    WolframAlpha是开发计算数学应用软件的沃尔夫勒姆 Wolfram 研究公司基于科学计算软件Mathematica开发出的新一代的搜索引擎 试图挑战Google搜索引擎的地位 能根据问题直接给出标准化答案的网站 比如输入一种材料名称
  • python 中的稀疏矩阵 svd

    有谁知道如何在 python 中对稀疏矩阵执行 svd 运算 scipy sparse linalg 中似乎没有提供这样的功能 听上去像稀疏向量这就是您正在寻找的 SVDLIBC 有效地封装在 Python 中 无需在 RAM 中创建额外的
  • 计算矩阵的零空间

    我正在尝试求解 Ax 0 形式的一组方程 A 是已知的 6x6 矩阵 我使用 SVD 编写了以下代码来获取在一定程度上有效的向量 x 答案大致正确 但不足以对我有用 我怎样才能提高计算的精度 将 eps 降低到 1 e 4 以下会导致函数失
  • 比较 R 中的 svd 和 princomp

    我想要得到singular values of a matrix in R获取主成分 然后也使用 princomp x 来比较结果 我知道 princomp 会给出主要成分 Question 如何从 d u 和 v 中获取主成分 解决方案s
  • 在 python 3 中从 SVD 重建矩阵

    你好 基本上我的问题是我有一个矩阵 我已经对其进行了 SVD 分解 并将其放入变量 u s 和 v 中 我对 s 矩阵进行了一些更改 使其成为对角线 并更改了一些号码 现在我基本上试图将它从 3 个矩阵重建为一个规则矩阵 然后返回到原始矩阵
  • 使用 svd 求解欠定 scipy.sparse 矩阵

    Problem 我有一组方程 其中变量用小写变量表示 常量用大写变量表示 A a b B c d C a b c d e 我在具有两列的 pandas DataFrame 中提供了有关这些方程结构的信息 常数 and 变量 E g df p
  • 使用 Mathnet 数字库进行 Svd 重组似乎是错误的

    我正在寻找 Mathnet Iridium 和 Mathnet Numerics 之间的非回归 这是我的代码 使用 Mathnet Numerics double symJaggedArray new double 5 symJaggedA
  • MATLAB eig 有时会返回倒号

    我正在尝试编写一个获取矩阵的程序A任何大小 SVD 分解它 A U S V Where A是用户输入的矩阵 U是由特征向量组成的正交矩阵A A S是奇异值的对角矩阵 并且V是特征向量的正交矩阵A A 问题是 MATLAB 函数eig有时会返
  • 使用 CUDA 并行实现多个 SVD

    我是使用 GPU 并行编程的新手 因此如果问题广泛或模糊 我深表歉意 我知道 CULA 库中有一些并行 SVD 函数 但是如果我有大量相对较小的矩阵需要分解 应该采取什么策略 例如我有n有维数的矩阵d n很大并且d是小 如何并行化这个过程
  • 奇异值分解:Jama、PColt 和 NumPy 的不同结果

    我想在一个大 稀疏 矩阵上执行奇异值分解 为了选择最好 最准确 的库 我尝试复制提供的 SVD 示例here http www ling ohio state edu kbaker pubs Singular Value Decomposi
  • 通过 SVD 从基本矩阵中提取翻译的正确方法

    我校准了相机并找到了内部参数 K 我还计算了基本矩阵 F 现在 E K T F K 到目前为止 一切都很好 现在我们将基本矩阵 E 传递给 SVD 以使用分解值 U W V 来提取旋转和平移 essentialMatrix K Transp
  • 在 PyTorch 中加速 SVD

    我正在使用 Pytorch 为 CIFAR10 执行一些分类任务 对于每次迭代 我都必须对每个批次进行一些预处理 然后才能将其反馈给模型 以下是每个批次的预处理部分的代码 S torch zeros batch size C H W for
  • R程序中非常大矩阵的svd

    我的 txt 文件中有一个矩阵 60 000 x 60 000 我需要获取该矩阵的 svd 我使用R 但我不知道R是否可以生成它 我认为可以计算 部分 svd使用irlba包装和bigmemory and bigalgebra无需使用大量内
  • 仅使用 CUDA 进行奇异值计算

    我正在尝试使用新的cusolverDnSgesvdCUDA 7 0 用于计算奇异值的例程 完整代码如下 include cuda runtime h include device launch parameters h include

随机推荐