正交匹配追踪(Orthogonal Matching Pursuit, OMP)的MATLAB实现

news2024/12/25 2:22:55

压缩感知(Compressed Sensing, CS)是一种利用稀疏信号的先验知识,用远少于奈奎斯特采样定理要求的样本数目恢复整个信号的技术。正交匹配追踪(Orthogonal Matching Pursuit, OMP)是一种常见的贪婪算法(Greedy algorithm),用于解决压缩感知中的信号重构问题。OMP算法试图找到一组稀疏基,这些基与测量值之间有最大的相关性,并且用于迭代地重构原始信号。

OMP算法

下面是OMP算法的简要步骤:

  1. 初始化残差 ( r_0 = y ),其中 ( y ) 是测量向量,稀疏性基矩阵 ( \Phi ),观测矩阵 ( \Psi ),支撑集 ( \Lambda = \emptyset )(选择的基函数的索引集),和迭代计数器 ( k = 0 )。

  2. 找到与当前残差最相关的列向量(原子) ( \phi_i )
    ( i = \arg\max_{j} | \langle r_k, \phi_j \rangle | )。

  3. 将选中的索引 ( i ) 加到支撑集 ( \Lambda ) 中 ( \Lambda = \Lambda \cup {i} )。

  4. 用最小二乘法从支撑集( \Lambda )上的列构建信号的近似解,即解线性方程 ( \Psi_{\Lambda} x’ = y ),得到( x’{\Lambda} ),在( \Lambda )上的系数,其中 ( \Psi{\Lambda} ) 表示 ( \Psi ) 的列仅包含 ( \Lambda ) 中索引对应的列。

  5. 更新残差 ( r_{k+1} = y - \Psi_{\Lambda} x’ )。

  6. 检查结束条件(例如,残差足够小,( ||r_{k+1}||_2 < \epsilon ) 或已达到预定的迭代次数)。如果未达到结束条件,( k = k + 1 ) 并返回步骤 2。

  7. 输出重建信号,将 ( x’ ) 在非 ( \Lambda ) 的位置上填充零。

MATLAB代码

以下是用MATLAB实现上述过程的代码示例:

% 定义参数
N = 128;       % 信号长度
M = 32;        % 测量数量
K = 10;        % 稀疏度(信号中非零值数量)

% 生成一个 K-稀疏信号(随机位置上有非零值)
x = zeros(N, 1);
q = randperm(N);
x(q(1:K)) = randn(K, 1);

% 创建一个随机高斯测量矩阵 Phi
Phi = randn(M, N) / sqrt(M);

% 生成测量值 y
y = Phi * x;

% 调用 OMP 算法
x_hat = OMP(y, Phi, eye(N), K);

% 绘制原始信号和恢复信号
figure;
subplot(2, 1, 1);
stem(x, 'b');
title('原始稀疏信号');
subplot(2, 1, 2);
stem(x_hat, 'r');
title('OMP恢复信号');

% OMP 函数
function x_hat = OMP(y, Phi, Psi, K)
    % y - 测量向量
    % Phi - 传感矩阵
    % Psi - 稀疏基矩阵(在这里是单位矩阵)
    % K - 稀疏度或迭代次数

    % 初始化
    r = y;                         % 初始残差(即测量值)
    index_set = [];                % 支撑集合
    x_hat = zeros(size(Psi, 2), 1); % 估计信号初始化
    
    for k = 1:K
        % 计算相关性
        correlations = abs(Phi'*r);

        % 选择具有最大相关性的索引
        [~, idx] = max(correlations);
        index_set = union(index_set, idx);

        % 使用当前支撑集合进行最小二乘求解
        x_temp = zeros(size(Psi, 2), 1);
        x_temp(index_set) = pinv(Phi(:, index_set)) * y;

        % 更新残差
        r = y - Phi(:, index_set) * x_temp(index_set);

        % 检查停止准则,可以是基于残差的
        if norm(r) < 1e-6
            break
        end
    end
    
    x_hat(index_set) = x_temp(index_set);
end

输出结果

输出结果如下,上面是原始信号,下面是恢复后的信号。

在这里插入图片描述

相关博文

理解并实现OpenCV中的图像平滑技术

OpenCV中的边缘检测技术及实现

OpenCV识别人脸案例实战

入门OpenCV:图像阈值处理

我的图书

下面两本书欢迎大家参考学习。

OpenCV轻松入门

李立宗,OpenCV轻松入门,电子工业出版社,2023
本书基于面向 Python 的 OpenCV(OpenCV for Python),介绍了图像处理的方方面面。本书以 OpenCV 官方文档的知识脉络为主线,并对细节进行补充和说明。书中不仅介绍了 OpenCV 函数的使用方法,还介绍了函数实现的算法原理。

在介绍 OpenCV 函数的使用方法时,提供了大量的程序示例,并以循序渐进的方式展开。首先,直观地展示函数在易于观察的小数组上的使用方法、处理过程、运行结果,方便读者更深入地理解函数的原理、使用方法、运行机制、处理结果。在此基础上,进一步介绍如何更好地使用函数处理图像。在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的实例来说明问题,避免使用过多复杂抽象的公式。

本书适合计算机视觉领域的初学者阅读,包括在校学生、教师、专业技术人员、图像处理爱好者。
本书第1版出版后,深受广大读者朋友的喜爱,被很多高校选为教材,目前已经累计重印9次。为了更好地方便大家学习,对本书进行了修订。
在这里插入图片描述

计算机视觉40例

李立宗,计算机视觉40例,电子工业出版社,2022
近年来,我深耕计算机视觉领域的课程研发工作,在该领域尤其是OpenCV-Python方面积累了一点儿经验。因此,我经常会收到该领域相关知识点的咨询,内容涵盖图像处理的基础知识、OpenCV工具的使用、深度学习的具体应用等多个方面。为了更好地把所积累的知识以图文的形式分享给大家,我将该领域内的知识点进行了系统的整理,编写了本书。希望本书的内容能够对大家在计算机视觉方向的学习有所帮助。
本书以OpenCV-Python(the Python API for OpenCV)为工具,以案例为载体,系统介绍了计算机视觉从入门到深度学习的相关知识点。
本书从计算机视觉基础、经典案例、机器学习、深度学习、人脸识别应用等五个方面对计算机视觉的相关知识点做了全面、系统、深入的介绍。书中共介绍了40余个经典的计算机视觉案例,其中既有字符识别、信息加密、指纹识别、车牌识别、次品检测等计算机视觉的经典案例,也包含图像分类、目标检测、语义分割、实例分割、风格迁移、姿势识别等基于深度学习的计算机视觉案例,还包括表情识别、驾驶员疲劳监测、易容术、识别年龄和性别等针对人脸的应用案例。
在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用复杂抽象的公式来介绍。
本书适合计算机视觉领域的初学者阅读,适于在校学生、教师、专业技术人员、图像处理爱好者使用。

在这里插入图片描述

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

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

相关文章

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

gpio 概述 刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在浮空输入状态 外部中断 所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个 GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,比如 PA1(或 PB1、…

windows下快速安装nginx 并配置开机自启动

1、下载地址&#xff1a;http://nginx.org/en/download.html 2、启动nginx 注意⚠️ 不要直接双击nginx.exe&#xff0c;这样会导致修改配置后重启、停止nginx无效&#xff0c;需要手动关闭任务管理器内的所有nginx进程。 在nginx.exe目录&#xff0c;打开命令行工具&#xf…

Linux搭建FISCO BCOS的第一个区块链网络

一、前言 FISCO BCOS是由金融区块链合作联盟&#xff08;深圳&#xff09;与微众银行共同发起的开源区块链项目&#xff0c;支持多链多账本&#xff0c;满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令搭建FISCO BCOS的第一个区块链网络。 目录 一…

Jetpack Compose -> 重组作用域和remember()

前言 上一章我们讲解了 MutableState 和 mutableStateOf() 本章我们讲解下 remember 这个关键方法&#xff1b; ReCompose Scope(重组作用域) 我们先来看一段代码 当我们将 var name by mutableStateOf("老A")lifecycleScope.launch{}这两行代码放到 setContent 中…

核密度分析

一.算法介绍 核密度估计&#xff08;Kernel Density Estimation&#xff09;是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用&#xff0c;包括&#xff1a; 数据可视化&#xff1a;核密度估计可以用来绘制平滑的密度曲线或热力图&#xff0c;从而直观地表…

使用transformer来训练自己的大模型实现自定义AI绘图软件的详细操作步骤

使用transformer来训练自己的大模型实现自定义AI绘图软件的详细操作步骤!下面的步骤是非常细致的,如果你有一台自己的GPU算力还算可以的服务器主机,想自己训练AI大模型。可以按照如下步骤开展操作。 要使用 Transformer 框架训练属于自己的大模型来完成 AI 绘图,需要经历以…

数字之美:探索人工智能绘画的奇妙世界

目录 引言AI绘画的定义与发展历程定义与发展历程AI绘画产品有哪些? AI绘画的应用领域设计与创意产业影视与游戏制作数字艺术与展览 AI绘画的基本原理与技术深度学习与神经网络生成对抗网络&#xff08;GAN&#xff09;风格迁移算法 AI绘画效果展示一只带着墨镜的小猫在高楼林立…

Vivado 2015.4安装记录

一、资源 安装破解包&#xff1a;Vivado2015.4,提取码&#xff1a;4eaw 二、安装 2.0 解压缩 2.0.1 解压缩Xilinx_Vivado_SDK_Win_2015.4_1118_2.tar.gz 2.0.2 解压缩Xilinx_Vivado_SDK_Win_2015.4_1118_2.tar 2.1 安装 安装驱动前&#xff0c;要拔掉与电脑连接的Xilinx下载…

qt-动画圆圈等待-LED数字

qt-动画圆圈等待-LED数字 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "LedNumber.h" #include <QLabel>LEDNumber::LEDNumber(QWidget *parent) : QWidget(parent) {//设置默认宽高比setScale((float)0.6);//设置默认背景色se…

fastjson解析自定义get方法导致空指针问题

背景 为了在日志中把出入参打印出来&#xff0c;以便验证链路和排查问题&#xff0c;在日志中将入参用fastjson格式化成字符串输出&#xff0c;结果遇到了NPE。 问题复现 示例代码 public static void main(String[] args) {OrganizationId orgId new OrganizationId();N…

HTML+CSS+JS:花瓣登录组件

效果演示 实现了一个具有动态花朵背景和简洁登录框的登录页面效果。 Code <section><img src"./img/background.jpeg" class"background"><div class"login"><h2>Sign In</h2><div class"inputBox"…

CoordConv(NeurIPS 2018)

paper&#xff1a;An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution official implementation&#xff1a;https://github.com/uber-research/coordconv 存在的问题 本文揭示并分析了CNN在两种不同类型空间表示之间转换能力的欠缺&#…

新书推荐:《分布式商业生态战略:未来数字商业新逻辑与企业数字化转型新策略》

近两年&#xff0c;商业经济环境的不确定性越来越明显&#xff0c;市场经济受到疫情、技术、政策等多方因素影响越来越难以预测&#xff0c;黑天鹅事件时有发生。在国内外经济方面&#xff0c;国际的地缘政治对商业经济产生着重大的影响&#xff0c;例如供应链中断&#xff0c;…

这才是No.1的门禁管理技巧!赶紧抄作业

随着社会的不断发展和科技的飞速进步&#xff0c;安全管理成为各个领域不可或缺的重要环节。在这个背景下&#xff0c;门禁监控系统作为一种先进而高效的安全管理工具逐渐受到了广泛关注和应用。 客户案例 企业大厦管理 在江苏某繁忙的商业大厦中&#xff0c;管理人员常常面临…

Elastic Stack--01--简介、安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. Elastic Stack 简介为什么要学习ESDB-Engines搜索引擎类数据库排名常年霸榜![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/051342a83f574c8c910cda…

尝试一下最新的联合办公利器ONLYOffice

下载下来一起试试吧 桌面安装版下载地址&#xff1a;https://www.onlyoffice.com/zh/download-desktop.aspx) 官网地址&#xff1a;https://www.onlyoffice.com 普通Office对联合办公的局限性 普通Office软件&#xff08;如Microsoft Office、Google Docs等&#xff09;在面对…

记一次 migo 报错 M7097 没有可用于物料 XXX 的库存过账

背景:公司重构SAP后&#xff0c;引入返利物料&#xff0c;此部分物料的数量统计单位是USD/CNY,不启用会计类视图&#xff0c;但是启用批次管理&#xff0c;但是正常物料不启用批次管理。这是大背景&#xff0c;物料类型为ZZZZ 但是实际需要的是 检查物料还是没有被用作其他方…

什么是web组态?

一、web组态的定义和背景 在深入探讨之前&#xff0c;我们先回顾一下“组态”的定义。在工业自动化领域&#xff0c;组态软件是用于创建监控和数据采集&#xff08;SCADA&#xff09;系统的工具&#xff0c;它允许工程师构建图形界面&#xff0c;实现与各种设备和机器的数据交互…

玩转网络抓包利器:Wireshark常用协议分析讲解

Wireshark是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。关于该工具的安装请参考之前的文章&#xff1a;地址 &#xff0c;…

本地配置多个git账户及ll设置

本地配置多个git账户 清除全局配置将命令行&#xff0c;切换到ssh目录生成GitLab和Gitee的公钥、私钥去对应的代码仓库添加 SSH Keys添加私钥ll设置 管理密钥验证仓库配置关于gitgitee.com: Permission denied (publickey) 清除全局配置 此步骤可以不做&#xff0c;经测试不影…