【Matlab】数字图像的 SVD 分解

news2024/11/18 13:44:21

奇异值分解 (SVD, Singular Value Decomposition) 是线性代数中一种重要的矩阵变换方法,对矩阵进行 SVD 分解,可以把复杂的矩阵简化,从而提取出重要的信息。数字图像的 SVD 分解是对数字图像建模的一种方法与工具,可以应用于图像压缩与图像处理等场景。本文主要介绍矩阵 SVD 分解的基本原理,以及使用 Matlab 对图像进行 SVD 分解与重建的过程。

 

目录

1. 矩阵的奇异值

2. 图像的 SVD 分解与重建


1. 矩阵的特征值与奇异值

        对于 n 阶方阵 A,如果存在 \lambda \in R 和非零列向量 \beta = (\beta_{1}, \beta_{2}, \dots , \beta_{n})^{T},使

A \beta = \lambda \beta

成立,则称 \lambda 是矩阵 A 的一个特征值,\beta 是 矩阵 A 对于特征值 \lambda 的一个特征向量。

        特征值的求解可以根据特征多项式  det(A-\lambda E) 进行,进一步可以将矩阵 A 对角化,即把矩阵 A 改写成可逆矩阵 P 和对角矩阵 \Sigma 乘积的形式。

A = P \Sigma P^{-1}

其中对角矩阵 \Sigma 对角线上的元素为 A 的特征值。

        然而对于 m x n 阶矩阵 (m ≠ n),特征值计算的方法不再适用,这时可以计算矩阵的奇异值。对于 m x n 阶矩阵 A,总可以分解成

A_{m \times n} = U_{m \times m} \Sigma_{m \times n} V_{n \times n}^{T}

的形式,其中矩阵 UV 是正交矩阵,对角矩阵 \Sigma 对角线上的元素为 A 的奇异值。

        为了求出 UV ,先构建方阵 A^{T}A 和 AA^{T},有

A^{T}A=V \Sigma ^{T} U^{T} U \Sigma V^{T}

= V \Sigma ^{T} \Sigma V^{T}

= V \Sigma^{T} \Sigma V^{-1}

AA^{T} = U \Sigma V^{T} V \Sigma^{T} U^{T}

= U \Sigma \Sigma^{T} U^{T}

= U \Sigma \Sigma^{T} U^{-1}

这表明 \Sigma ^{T} \Sigma 是 A^{T}A 的对角化矩阵,\Sigma \Sigma ^{T} 是 AA^{T} 的对角化矩阵。矩阵 VU 分别是 A^{T}A 和 AA^{T} 的对角变换矩阵。

2. 图像的 SVD 分解与重建

        在数字图像处理中,一幅大小为 M x N 的灰色图像可以表示成如下矩阵的形式,

I(x,y) = \begin{bmatrix} f(0,0) & f(1,0) & \cdots & f(M-1,0) \\ f(0,1) & f(1,1) & \cdots & f(M-1,1))\\ \vdots & \vdots & \ddots & \vdots \\ f(0,N-1) & f(1,N-1) & \cdots & f(M-1,N-1) \end{bmatrix}

其中 f(x,y) 是 xy 空间中的二维函数,其函数值表示图像在对应点的灰度。

        对于彩色图像,可以将多个分量按照行或者列的方向进行拼接,例如 M x N x 3 的图像进行拼接得到一个 3M x N 的矩阵。了解了这一点,就可以对数字图像应用奇异值分解的方法。

        Matlab 中关于 svd 奇异值分解函数的用法说明如下。

        使用 Matlab 进行数字图像的 SVD 分解与重建的大致思路如下:

(1)读取想要处理的图像,转换数据类型为 double 类型;

(2)将图像的不同颜色分量按某个方向进行拼接,得到 img_merge;

(3)对 img_merge 进行 SVD 分解,求出 U,S 和 V 三个矩阵;

(4)选取想要保留的奇异值的个数 k,构建新的矩阵 U1,S1 和 V1;

(5)使用 U1,S1 和 V1 生成生成新的图像,并进行显示。

Matlab 代码和运行结果如下。

clear, clc

% 基于SVD的图像压缩
img = imread('./cat.png');
img = im2double(img);

% 图像颜色分量的拼接
[m,n,d] = size(img);
img_merge = [img(:,:,1); img(:,:,2); img(:,:,3)];

% 图像的svd分解
[U,S,V] = svd(img_merge, 'econ');

% 保留前k个奇异值,生成新的图像
s = diag(S);
i = 0;
figure(1)
for k = [10,30,70,100] % k分别取10,30,70和100
    U1 = U(:,1:k);
    S1 = diag(s(1:k));
    V1 = V(:,1:k);
    tmp = U1*S1*V1';
    img_new(:,:,1) = tmp(0*m+1:1*m,:);
    img_new(:,:,2) = tmp(1*m+1:2*m,:);
    img_new(:,:,3) = tmp(2*m+1:3*m,:);
    subplot(221+i)
    imshow(im2uint8(img_new)) % 显示图像
    title(['k=',num2str(k)])  % 添加标题
    hold on
    i = i + 1;
end

 

可以看到,当 k 取 70 的时候,重建的图像已经可以很好地还原图像。

如果有写得不正确的地方,欢迎指正 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统01-导论

一、概述 操作系统:英文是operating system,OS 它的作用运行用户程序(核心目标)高效使用计算机(面向系统)方便使用计算机(面向用户) 二、内容 2.1 现代计算机系统 一个或多个CPU和…

机器学习:self supervised learning

340M 参数 BERT 自监督学习的目标跟目标越接近越好。 一个任务:预测句子中被mask的词: BERT通过Masking Input来获得训练数据 mask有两种做法: 将某个字token换成一个特殊符号(代表盖住) 随机把某个字换成另外一个…

chatgpt赋能python:Python程序怎么打包

Python程序怎么打包 Python作为一种功能强大的编程语言,它的很多应用都需要打包成可执行文件或者可以方便部署的代码。本篇文章将介绍Python程序打包的方法及步骤。 为什么需要打包? 分享代码或程序:当你编写了一个Python程序并且想要分享给…

【⑥MySQL多表查询】:让你的数据检索更高效

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL中多表查询相关知识的讲解 目录 前言一、多表关系二、多表查询1、交叉连接2、内连接3、外连接 三、集合运算四、七种JOINS实现五、多表查询练习六、总结 一、多表关系 ✨项目开发中,在进行数据库表结…

MySQL生产环境高可用架构详解

一、MySQL高可用集群介绍 1、数据库主从架构与分库分表 随着现在互联网的应用越来越大,数据库会频繁的成为整个应用的性能瓶颈。而 我们经常使用的MySQL数据库,也会不断面临数据量太大、数据访问太频繁、数据 读写速度太快等一系列的问题。所以&#xf…

记录分享在10年老的商务本Dell E6230上安装Debian 12的过程,遇到的问题和解决方法

原先在笔记本上安装的是Debian 9,最近发现无法更新了,查一下发现,所有的“源”只支持deb10,11 和 12,所以特意订了一块新的硬盘来安装新系统,前后倒腾了两天多。 在此记录这个过程中遇到的问题和解决的方法…

Mysql主从复制和读写分离(期望日子清静,抬头皆是温柔)

文章目录 一、读写分离1.什么是读写分离?2.为什么要读写分离呢?3.什么时候要读写分离?4.读写分离原理5.读写分离方式(1)基于程序代码内部实现(2)基于中间代理层实现 二、主从复制1.主从复制与读写分离的关系2.mysql支持的复制类…

langchain源码阅读系列(一)之LLM输入输出管理

原文首发于博客文章OpenAI 文档解读 LangChain 主体分为 6 个模块,分别是对(大语言)模型输入输出的管理、外部数据接入、链的概念、(上下文记忆)存储管理、智能代理以及回调系统,通过文档的组织结构&#x…

如何编写一个最简单的 udp 版本的 echo server 和 echo client(小白也懂!)

目录 目的 第一步 编写Server(服务器) 第二步 创建Server的各类参数 第三步 实现具体的Server内容 第四步 编写Client(客户端) 实现具体的Client内容 总流程 总代码 源码下载 目的 我们编写一个udp 版本的 echo server 和 echo client 实现在自己电脑上通过客户端…

open【部署、使用教程】

目录 【1】创建证书 【2】安装openVPN-Server端并配置 【3】将证书移动到相对路径 【4】开启内核转发功能,否则会无法启动openVPN 【5】启动服务,加入开机自启 【6】启动后服务端会生成一个tun0的虚拟网卡,用于不同网段之间相互通信 【…

VUE2.0集成 Markdown 编辑器

Markdown编辑器的使用 这是一款基于Vue的markdown编辑器。既可以用来编辑Markdown语法,又可以用来解析 效果图,mavonEditor实现了Markdown集成 Markdown是一种标记语言,相较于word文档更加清晰方便,适合进行笔记等。将Markdown集成进入自己项…

Matlab使用S函数

什么是S函数? S-函数是系统函数(System Function)的简称,在 Simulink 中用非图形化的方式来描述一个模块。一个完整的S-函数结构体系包含了描述一个动态系统所需要的全部能力。使用S-函数用户可以向 Simulink 模型中添加自己的模块…

【PCB专题】Allegro中设置泪滴

PCB绘制完成后有时按需要对PCB进行添加泪滴的操作是非常必要的。 添加泪滴的作用主要是: 信号传输时平滑阻抗,减少阻抗的急剧跳变,避免高频信号传输时由于线宽突然变小而造成反射。 焊接时可以保护焊盘,避免多次焊接时焊盘的脱落,生产时可以避免蚀刻不均,以及过孔偏位出…

一键安装和导出当前Python项目的依赖包总结

创建python环境,配置一个python运行项目。在项目可以运行的环境下,导出该项目所依赖包到一个requirements.txt文档中。在另一个纯净环境中,快速批量安装项目所依赖的包,便于快速进行项目迁移 一、导出当前Python项目的依赖包1、方…

【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问

目录 一、虚拟头节点二、数组的随机访问三、动态数组、链表复杂度分析四、动态数组 add(E element) 复杂度分析五、动态数组的缩容 一、虚拟头节点 🌼 为了让代码更加精简,统一所有节点的处理逻辑,可以在最前面增加一个虚拟的头节点&#xf…

2023 年最佳 C++ IDE

文章目录 前言1. Visual Studio2. Code::Blocks3. CLion4. Eclipse CDT(C/C 开发工具)5. CodeLite6. Apache NetBeans7. Qt Creator8. Dev C9. C Builder10. Xcode11. GNAT Programming Studio12. Kite总结 前言 要跟踪极佳 IDE(集成开发环境…

嵌入式系统复习要点

目录 1、嵌入式系统的核心部分主要由硬件和软件两部分组成: 2、嵌入式系统硬件: 3、嵌入式处理器从体系上分类,可以分为冯诺依曼结构和哈佛结构两种: 4、几类常见的嵌入式处理器类型: 5、MCU组成结构:…

chatgpt赋能python:介绍:Python经典小游戏合集

介绍:Python经典小游戏合集 作为一门简洁易学、受到广泛喜爱的编程语言,Python已经在各个领域中得到了广泛应用,包括游戏开发。在这篇文章中,我们将为您介绍一些Python编程中的经典小游戏,让您感受到Python的多功能性…

idea乱码的相关问题

idea控制台乱码(即:tomacat等启动时的乱码) 第一步: 控制台tomcat启动信息乱码解决(红色字体) 1 在本地 tomcat 的配置文件中找到 logging.properties 文件设置日志输出的编码为 UTF-8 追加的配置信息为…

【Android复习笔记】Handler机制(一)

从 Android 初学者常见的一个错误开始: 导致这个错误的代码通常长下面这样: new Thread(){@Overridepublic void run() {new Handler(); } }.