压缩感知的图像仿真(MATLAB源代码)

压缩感知是一种用于高效获取和表示信号的技术,它可以显著减少数据的采样和传输量,同时保持对信号的高质量恢复能力。在压缩感知中,信号被表示为其在一个稀疏基中的稀疏线性组合。通过仅使用少量的随机投影测量,就能够捕捉信号的大部分信息,并且可以利用优化方法恢复原始信号。

MATLAB是一种功能强大的数值计算和科学编程工具,它提供了丰富的工具箱和函数来支持压缩感知的仿真和实现。其中一个常用的工具是l1_image软件包,它提供了一种基于l1范数最小化的方法,用于压缩感知图像恢复。

通过调用l1_image,我们可以在MATLAB环境中轻松地对压缩感知方法进行仿真和实验。l1_image提供了一系列函数来生成随机投影矩阵、计算稀疏表示、执行l1范数最小化等操作。通过使用这些函数,我们可以通过少量的测量数据恢复出高质量的原始图像。

在本文中,我们将详细介绍如何使用MATLAB中的l1_image工具包来实现压缩感知图像恢复。

仿真实现

下面我们看看MATLAB如何实现

MATLAB代码

计算量太大了,仅仅选取了lena眼睛的部分,大概在([250:299],[250:299])区域内选择一块roi就好了。
具体代码如下:
【说明】本代码来源于MATLAB网站,网址在最后。

% compressed sensing example
%
%___DESCRIPTION___
% MATLAB implementation of compressive sensing example as described in R.
% Baraniuk, Compressive Sensing, IEEE Signal Processing Magazine, [118],
% July 2007. The code acquires 250 averaged random measurements of a 2500
% pixel image. We assume that the image has a sparse representation in the
% DCT domain (not very sparse in practice). Hence the image can be
% recovered from its compressed form using basis pursuit.
%
%___DEPENDENCIES___
% Requires the MATLAB toolbox l_1-MAGIC: Recovery of Sparse Signals via Convex
% Programming v1.11 by J. Candes and J. Romberg, Caltech, 2005. 
%
%___VARIABLES___
% x = original signal (nx1) y = compressed signal (mx1) Phi = measurement
% matrix (mxn) Psi = Basis functions (nxn) Theta = Phi * Psi (mxn) s =
% sparse coefficient vector (to be determined) (nx1)
%
%___PROBLEM___
% Invert the matrix equation y = Theta * s and therefore recover hat_x as
% k-sparse linear combination of basis functions contained in Psi. Note
% also that y = Phi * x.
%
%___SOLUTION___
% Let Phi be a matrix of i.i.d. Gaussian variables. Solve matrix inversion
% problem using basis pursuit (BP).%___CREATED___
% o By S.Gibson, School of Physical Sciences, University of Kent. 
% o 1st May, 2013.
% o version 1.0
% o NOTES: If the max number of iterations exceeds 25, error sometimes
%   occurs in l1eq_pd function call.
%
%___DISCLAIMER___
% The code below is my interpretation of Baraniuk's compressed sensing
% article. I don't claim to be an authority on the subject!%___INPUT IMAGE___
clear, close all, clc
A = imread('lenaGray.bmp');
% A = A([50:99],[50:99]);
A = A([250:299],[250:299]); % 提取图像的一个子区域
x = double(A(:));
n = length(x);%___MEASUREMENT MATRIX___
m = 1000; % NOTE: small error still present after increasing m to 1500;
Phi = randn(m,n);%__ALTERNATIVES TO THE ABOVE MEASUREMENT MATRIX___ %Phi = (sign(randn(m,n))+ones(m,n))/2; % micro mirror array (mma) e.g. single%pixel camera Phi = orth(Phi')'; % NOTE: See Candes & Romberg, l1%magic, Caltech, 2005.%___COMPRESSION___
y = Phi*x;%___THETA___
% NOTE: Avoid calculating Psi (nxn) directly to avoid memory issues.
Theta = zeros(m,n);
for ii = 1:niiek = zeros(1,n);ek(ii) = 1;psi = idct(ek)';Theta(:,ii) = Phi*psi;
end%___l2 NORM SOLUTION___ s2 = Theta\y; %s2 = pinv(Theta)*y
s2 = pinv(Theta)*y;%___BP SOLUTION___
s1 = l1eq_pd(s2,Theta,Theta',y,5e-3,20); % L1-magic toolbox
%x = l1eq_pd(y,A,A',b,5e-3,32);%___DISPLAY SOLUTIONS___
plot(s2,'b'), hold
plot(s1,'r.-')
legend('least squares','basis pursuit')
title('solution to y = \Theta s')%___IMAGE RECONSTRUCTIONS___
x2 = zeros(n,1);
for ii = 1:niiek = zeros(1,n);ek(ii) = 1;psi = idct(ek)';x2 = x2+psi*s2(ii);
endx1 = zeros(n,1);
for ii = 1:niiek = zeros(1,n);ek(ii) = 1;psi = idct(ek)';x1 = x1+psi*s1(ii);
endfigure('name','Compressive sensing image reconstructions')
subplot(1,3,1), imagesc(reshape(x,50,50)), xlabel('original'), axis image
subplot(1,3,2), imagesc(reshape(x2,50,50)), xlabel('least squares'), axis image
subplot(1,3,3), imagesc(reshape(x1,50,50)), xlabel('basis pursuit'), axis image
colormap gray

测试结果

看下第2种的整体效果还可以,这里对源程序的观察值略做了修改。
源程序选的的250个观察值,相当于250/2500,十分之一。
这里选取了1000个,1000/2500,大概四分之一。
十分之一的效果大家可以测试一下,效果非常不好。
第一种很拉胯。

在这里插入图片描述

增加到2000个点的效果:
可以看到明显好了很多。
在这里插入图片描述
增加到2200个点的效果:
在这里插入图片描述
哈哈哈哈哈哈哈,2500个点,
在这里插入图片描述

部分注释

矩阵逆运算

s2 = pinv(Theta)*y 是一种使用广义逆运算(generalized inverse operation)求解线性方程组的方法,其中 pinv(Theta) 表示矩阵 Theta 的Moore-Penrose伪逆(pseudo-inverse)。这个方法是使用最小二乘法(least squares method)来估计线性方程组的解。

在给定线性方程组 y = Theta * s 的情况下,其中 y 是已知的观测向量,Theta 是系统的矩阵,s 是未知的向量,我们希望寻找一个解 s2,使得 Theta * s2 尽可能接近观测向量 y。然而,在实际问题中,往往无法直接求解 s。这时,我们可以使用最小二乘法来近似求解。

求解的步骤如下:

  1. 计算矩阵 Theta 的 Moore-Penrose 伪逆 pinv(Theta),它是一个满足 Theta * pinv(Theta) * Theta = Thetapinv(Theta) * Theta * pinv(Theta) = pinv(Theta) 的矩阵。
  2. ypinv(Theta) 相乘,得到近似的解 s2

这样,s2 就是通过最小二乘法来估计线性方程组的解。它是一种经典的求解方法,在信号处理和线性代数中经常使用。然而,需要注意的是,在特定的问题情况下,使用其他方法可能会提供更好的结果,特别是在信号是稀疏的情况下。

求解稀疏矩阵

s1 = l1eq_pd(s2,Theta,Theta',y,5e-3,20);
这行代码是使用 L1-magic工具箱(一个专门用于解决稀疏重构问题的 MATLAB 工具箱)来求解压缩感知(Compressed Sensing)问题的一部分。在上述代码中,具体使用的是基于原始-对偶内点法(Primal-Dual Interior-Point Method)的L1范数最小化算法,目的是求解等式约束下的L1最小化问题。

这里是函数 l1eq_pd 的基本使用语法及含义:

  • s1:是求解的稀疏信号估计值,即原始信号在稀疏域中的表示。
  • l1eq_pd:是L1-magic工具箱中用于解决等式约束L1最小化问题的函数名。
  • s2:是最小化过程的初始解,通常可以是一个零向量,但这里用的是前面得到的最小二乘解(可能是为了提供一个更好的起点,加速算法的收敛)。
  • Theta:是测量矩阵或传感矩阵与稀疏基的乘积矩阵。
  • Theta':是Theta矩阵的转置。
  • y:是已知的观测向量,也就是压缩感知中的测量结果。
  • 5e-3:是一个正则化参数,这个参数可以平衡稀疏约束和数据保真度之间的权重,经常需要通过实验来选择一个合适的值。
  • 20:可能是算法迭代的次数,或者是内点法中某个容忍度的设置。

这个函数将最小化以下的目标函数:

minimize ||s||_1 subject to Theta * s = y

这里的 ||s||_1 表示的是向量 s 的 L1 范数,即其所有元素绝对值的和。这种L1最小化在 s 预计是稀疏的情况下尤其有用,因为它倾向于产生只有少数非零项的解,这与压缩感知理论中的稀疏性假设相吻合。

总结来说,这个命令是尝试在给定等式约束下通过L1最小化来寻找一个解 s1,该解中非零项的数量尽可能少,同时解应尽可能地符合原始问题的约束 Theta * s = y

参考资料:

1、主体程序网址:
simple compressed sensing example
2、l1_image网址:
l1_image

相关博文

理解并实现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.mzph.cn/news/695789.shtml

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

相关文章

报表控件Stimulsoft 新版本2024.1中,功能区工具栏新功能

今天,我们将讨论Stimulsoft Reports、Dashboards 和 Forms 2024.1版本中的一项重要创新 - 在一行中使用功能区工具栏的能力。 Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinF…

Elasticsearch Update By Query详解

1. 使用场景 一般在以下几种情况时,我们需要重建索引: 索引的 Mappings 发生变更:字段类型更改,分词器及字典更新 索引的 Setting 发生变更:索引的主分片数发生改变 集群内,集群间需要做数据迁移 Elastiic…

【移动安全】MobSF联动安卓模拟器配置动态分析教程

原文链接 MobSF联动安卓模拟器配置动态分析教程 实现方式 Windows开启安卓模拟器并进行相关配置作为调试客户端,Linux使用docker开启MobSF作为服务端。 好处:干净,部署简单,不用安装乱七八糟的环境,防止破坏其他应…

STM32F10X(Cortex-M3)系统定时器寄存器笔记和系统定时器精准延时函数

Cortex-M3系统定时器寄存器笔记和系统定时器精准延时函数 简介系统定时器寄存器STK_CTRLSTK_LOADSTK_VALSTK_CALIB STM32F10X(Cortex-M3)精准延时函数 简介 在STM32F10X(Cortex-M3)除了通用定时器和看门狗定时器外,还有一个系统定时器(SysTick) 拿STM32F103C8T6来说…

ES6 | (一)ES6 新特性(上) | 尚硅谷Web前端ES6教程

文章目录 📚ES6新特性📚let关键字📚const关键字📚变量的解构赋值📚模板字符串📚简化对象写法📚箭头函数📚函数参数默认值设定📚rest参数📚spread扩展运算符&a…

干货分享 | TSMaster 序列发送模块在汽车开发测试中的应用

众所周知,序列发送模块可以不需要脚本代码实现测试中特定控制报文序列的发送,该模块多用于循环顺序控制的测试案例中。序列发送模块的常用场景,主要是针对一些新开发的产品需要通过该模块来验证产品功能等等。本文重点和大家分享一下关于TSMa…

力扣102 二叉树的层序遍历 Java版本

文章目录 题目描述思路代码 题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[…

辉辉数码:目前电视盒子哪个最好?目前性能最好的电视盒子

大家好,我是辉辉,上期测评发布后我收到了很多粉丝的反馈希望我这期能分享电视盒子推荐,看看目前电视盒子哪个最好。我购入了市面上最热门的十几款电视盒子对比配置、系统后整理了五款目前性能最好的电视盒子推荐给大家。 品牌型号&#xff1…

计算机网络-局域网和城域网(二)

1.局域网互联设备: 2层网桥(生成树、源路由)、3层交换机、路由器。网桥要求3层以上协议相同,1、2层协议不同可互联。 2.生成树网桥: 又叫透明网桥,IEEE802.1d,生成树算法。基本思想是在网桥之…

Spring Security学习(六)——配置多个Provider(存在两种认证规则)

前言 《Spring Security学习(五)——账号密码的存取》一文已经能满足一般应用的情况。但实际商业应用也会存在如下的情况:用户提交的账号密码,能在本地的保存的账号密码匹配上,或者能在远端服务认证中匹配上&#xff…

提示找不到msvcr110.dll怎么解决?这5个方法简单有效搞定

在计算机系统运行过程中,如果发现无法找到msvcr110.dll这个特定的动态链接库文件,通常会引发一系列问题和困扰。首先,这可能导致某些应用程序无法正常启动或运行,因为msvcr110.dll是许多基于Microsoft Visual C编译的应用程序所必…

如何使用Docker本地部署Jupyter+Notebook容器并结合内网穿透实现远程访问

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook,并结合cpolar内网穿透…

新版Java面试专题视频教程——多线程篇①

新版Java面试专题视频教程——多线程篇① Java多线程相关面试题 0. 问题汇总0.1 线程的基础知识0.2 线程中并发安全 1.线程的基础知识1.1 线程和进程的区别?1.2 并行和并发有什么区别?1.3 创建线程的四种方式1.4 runnabl…

ES6 | (二)ES6 新特性(下) | 尚硅谷Web前端ES6教程

文章目录 📚迭代器🐇定义🐇工作原理🐇自定义遍历数据 📚生成器函数🐇声明和调用🐇生成器函数的参数传递🐇生成器函数案例 📚Promise📚Set🐇Set的定…

fastApi笔记05-路径参数和数值校验

使用Path可以对路径参数声明与Query相同类型的校验和元数据 from typing import Annotatedfrom fastapi import FastAPI, Path, Queryapp FastAPI()app.get("/items/{item_id}") async def read_items(item_id: Annotated[int, Path(title"The ID of the item …

微服务篇之限流

一、为什么要限流 1. 并发的确大(突发流量)。 2. 防止用户恶意刷接口。 二、限流的实现方式 1. Tomcat限流 可以设置最大连接数,但是每一个微服务都有一个tomcat,实现起来非常麻烦。 2. Nginx限流 (1)控…

假如C++进入Linux内核,那么需要做哪些改造?

假如C进入Linux内核,那么需要做哪些改造? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&#xf…

ChatGPT安卓版正式发布,附安装包,但有款手机无法使用

ChatGPT安卓版如约而至,OpenAI正式宣布该应用已在谷歌应用商店上架,用户可以免费下载,对话不限次数。 但是安卓版ChatGPT目前仅在美国、印度、孟加拉国和巴西提供下载,下周将会推广至更多国家。 网页端下载链接: http…

五、矩阵的运算

1、矩阵的加减: 前提:两个矩阵必须是同形矩阵。 矩阵加减具有交换律,矩阵矩阵相乘没有交换律。 计算结果:元素级运算。 2、矩阵的数乘: 计算结果:元素级运算。这里要区别与行列式的数乘。 3、矩阵与向量的乘法: 前提:矩阵的列数等于向量的行数。 计算方式:左列…

【Linux基础】vim、常用指令、组管理和组权限

Linux基础 1、目录结构2、vi和vim3、常用指令运行级别找回密码帮助指令时间日期指令搜索查找文件目录操作磁盘管理指令压缩和解压缩 4、组管理和组权限用户操作指令权限 1、目录结构 Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”&a…