压缩感知的图像仿真(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:n
    ii
    ek = 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:n
    ii
    ek = zeros(1,n);
    ek(ii) = 1;
    psi = idct(ek)';
    x2 = x2+psi*s2(ii);
end

x1 = zeros(n,1);
for ii = 1:n
    ii
    ek = zeros(1,n);
    ek(ii) = 1;
    psi = idct(ek)';
    x1 = x1+psi*s1(ii);
end

figure('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余个经典的计算机视觉案例,其中既有字符识别、信息加密、指纹识别、车牌识别、次品检测等计算机视觉的经典案例,也包含图像分类、目标检测、语义分割、实例分割、风格迁移、姿势识别等基于深度学习的计算机视觉案例,还包括表情识别、驾驶员疲劳监测、易容术、识别年龄和性别等针对人脸的应用案例。
在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用复杂抽象的公式来介绍。
本书适合计算机视觉领域的初学者阅读,适于在校学生、教师、专业技术人员、图像处理爱好者使用。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue状态管理库-Pinia

一、Pinia是什么? Pinia 是 Vue 的专属状态管理库,它允许支持跨组件或页面共享状态,即共享数据,他的初始设计目的是设计一个支持组合式API的 Vue 状态管理库(因为vue3一个很大的改变就是组合式API),当然这…

【数学建模入门】

数学建模入门 数学建模需要的学科知识怎么学习数学模型如何读好一篇优秀论文数学建模赛题常见类别数学建模常见问题数学建模组队和分工数学建模准备工作 数学建模需要的学科知识 怎么学习数学模型 💦推荐阅读书籍: 《数学建模算法与应用》,…

tensorboard的用法

部分测试代码: from torch.utils.tensorboard import SummaryWriter import numpy as np from PIL import Image import torch import cv2 as cv import matplotlib.pyplot as plt from torch import nn from torchvision import datasetsdef functiontools():writ…

ros自定义action记录

文章目录 自定义action1. 定义action文件2. 修改 package.xml3. 修改 CMakeLists.txt4. 运行 catkin build4. simple_action_server.py5. simple_action_client.py 测试 自定义action ros 版本:kinetic 自定义test包的文件结构如下 |-- test | |-- CMakeLists.t…

Django使用Celery异步

安装包 pip install celerypip install eventlet 1.在项目文件的根目录下创建目录结果 2. 在main.py文件中 # !/usr/bin/env python # -*-coding:utf-8 -*-""" # Author :skyTree # version :python 3.11 # Description&#…

el-table同时固定左列和右列时,出现错误情况

最近遇到一个问题,就是需求是要求表格同时固定序号列和操作列,我们用的是饿了么组件库的el-table,如下图,出现了错误情况: 解决方法就是使用doLayout方法: 如果使用了keep-alive,可以在activated里执行doLayout方法: activated() {this.$nextTick(() => {this.$ref…

Qt应用-天气预报实例

本文讲解Qt实现天气预报实例。 实现的功能 网络实时获取和显示6天的天气参数并绘制温度趋势曲线; 测试当前网络连接情况; 获得当前的IP地址的行政位置信息; 设计界面如下: 创建保存天气数据的类 #ifndef WEATHERDATA_H #define WEATHERDATA_H #include <QString>…

【设计模式】01-装饰器模式Decorator

作用&#xff1a;在不修改对象外观和功能的情况下添加或者删除对象功能&#xff0c;即给一个对象动态附加职能 装饰器模式主要包含以下角色。 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08…

Nginx 和 Apache 的比较

Nginx和Apache的对比 Nginx和Apache的优缺点比较 (1)nginx相对于apache的优点 ①轻量级&#xff0c;同样起web服务&#xff0c;比apache占用更少的内存及资源 ②抗并发&#xff0c;nginx处理请求是异步非阻塞的&#xff0c;而apache是阻塞型的在高并发下&#xff0c;nginx能保持…

FPGA OSERDESE2

Output Parallel-to-Serial Logic Resources (OSERDESE2) OSERDESE2 在Xilinx 7 系列器件是一款专用的并行至串行转换器,具有特定的时钟和逻辑资源,旨在促进高速源同步接口的实现。每个OSERDESE2模块都包括一个专用的数据串行器和 3 状态控制。数据和 3 态串行器都可以在 SD…

AOSP10 替换系统launcher

本文实现将原生的launcher 移除&#xff0c;替换成我们自己写的launcher。 分以下几个步骤&#xff1a; 一、新建一个自己的launcher项目。 1.直接使用android studio 新建一个项目。 2.修改AndroidManifest.xml <applicationandroid:persistent"true"androi…

32FLASH闪存

目录 一&#xff0e;FLASH简介 二&#xff0e;代码实现 &#xff08;1&#xff09;读写内部FLASH &#xff08;2&#xff09;读取芯片ID 一&#xff0e;FLASH简介 存储器地址要记得累 系统存储器是原厂写入的Bootloader程序&#xff08;用于串口下载&#xff09;&#xff0…

css4浮动+清除浮动

浮动 一.常见网页布局1.三种布局方式2.布局准则 二.浮动&#xff08;float&#xff09;1.好处2.概念3.三大特性4.使用5.常见网页布局模板6.注意点 三.清除浮动1.why2.本质3.语法4.四种way&#xff08;后三个都是给父级添加&#xff09;清除浮动总结 一.常见网页布局 1.三种布局…

[java基础揉碎]this

引出this: 什么是this: java虚拟机会给每个对象分配 this&#xff0c;代表当前对象。 这里的this就是new出来的这个对象 this的本质: this是个引用在堆中指向它自己: this的细节: 访问成员方法: 访问构造器:

DPDK应该如何入门学习?

01 写在前面 我的读者当中应该有一部分人是做 DPDK 相关的&#xff0c;我自己虽然现在已经不做 DPDK 了&#xff0c;但对这块仍然有兴趣&#xff0c;今天这篇文章就来总结下 DPDK 的技术栈。注意&#xff1a;这篇文章是小白文&#xff0c;不适合大神哦。 文章从 DPDK 的产生背…

实战打靶集锦-025-HackInOS

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查5. 提权5.1 枚举系统信息5.2 探索一下passwd5.3 枚举可执行文件5.4 查看capabilities位5.5 目录探索5.6 枚举定时任务5.7 Linpeas提权 靶机地址&#xff1a;https://download.vulnhub.com/hackinos/HackInOS.ova 1. 主机…

【PyTorch][chapter 17][李宏毅深度学习]【无监督学习][ Auto-encoder]

前言&#xff1a; 本篇重点介绍AE&#xff08;Auto-Encoder&#xff09; 自编码器。这是深度学习的一个核心模型. 自编码网络是一种基于无监督学习方法的生成类模型,自编码最大特征输出等于输入 Yann LeCun&Bengio, Hinton 对无监督学习的看法. 目录&#xff1a; AE 模型原…

华为笔记本原厂系统镜像恢复安装教程方法

1.安装方法有两种&#xff0c;一种是用PE安装&#xff0c;一种是华为工厂包安装&#xff08;安装完成自带F10智能还原&#xff09; 若没有原装系统文件&#xff0c;请在这里远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f …

跳表是一种什么样的数据结构

跳表是有序集合的底层数据结构&#xff0c;它其实是链表的一种进化体。正常链表是一个接着一个用指针连起来的&#xff0c;但这样查找效率低只有O(n)&#xff0c;为了解决这个问题&#xff0c;提出了跳表&#xff0c;实际上就是增加了高级索引。朴素的跳表指针是单向的并且元素…

关于Linux中使用退格键出现^H的问题解决

关于Linux中使用退格键出现^H的问题解决 今天在Linux下执行脚本和监听端口的输入时候&#xff0c;不小心输错内容想要删除用退格键发现变成了^H&#xff0c;从网上查了资料并且实际应用了一下&#xff08;我的虚拟机是CentOS7&#xff09;。 使用ctrl退格键即可成功删除内容 …