压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法

news2024/11/26 17:41:57

  • 压缩感知系列博客:
  • 压缩感知入门①从零开始压缩感知
  • 压缩感知入门②信号的稀疏表示和约束等距性
  • 压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法

文章目录

  • 1. Problem
  • 2. 仿真结果
  • 3. MATLAB算法
  • 4. 源码地址
  • 参考文献

1. Problem


信号压缩是是目前信息处理领域非常成熟的技术,其主要原理是利用信号的稀疏性。一个稀疏信号的特征是,信号中有且仅有少量的位置是有值的,其它位置都是零。对于一个稀疏的信号,在存储时只需要记录有值的位置,从而实现对原始信号的压缩。

对于原本不稀疏的信号,可以利用一种字典(正交变换基,例如傅里叶、小波)对信号进行线性表示,得到原始信号在这个稀疏域上的稀疏表示系数,只需要记录这些少量的系数就能够实现对信号的压缩存储。

在信号重建时,首先对信号补零得到原始维度的信号,由于采用的变换字典是正交的,可以通过正交的变换得到原始信号。

压缩感知与传统的信号压缩有着异曲同工之妙,而不同之处在于,压缩感知的信号压缩过程是将原始的模拟信号直接进行压缩(采样即压缩)。而传统信号压缩通常是先将信号采样后再进行压缩(采样后压缩),这种压缩方式的主要问题在于采用较高的采样资源将信号采集后,又在信号压缩过程将费尽心思采集到的信号丢弃了,从而造成资源的浪费1

以经典的图像采集为例,对于一副 m × n m\times n m×n的图像信号 I I I进行采集,根据正交变换的思想,至少要对其进行 N = m × n N=m\times n N=m×n次采样才能够得到这副图像。

若该图像是稀疏的,根据压缩感知理论,可以至少进行 M M M次采样就能够采集到该信号,其中 M < < N M<<N M<<N M M M的值有信号的稀疏性决定。

一个压缩感知采样过程可以表示为

A x = b + e (1) Ax=b+e\tag{1} Ax=b+e(1)

其中, A ∈ R M × N A\in \mathbb R^{M\times N} ARM×N表示观测矩阵, x ∈ R N × 1 x\in \mathbb R^{N\times 1} xRN×1表示 I ∈ R m × n I\in \mathbb R^{m\times n} IRm×n的向量形式, b ∈ R M × 1 b\in \mathbb R^{M\times 1} bRM×1表示测量向量, e ∈ R M × 1 e\in \mathbb R^{M\times 1} eRM×1表示测量噪声。可以看到,一个 N N N维的信号在采样过程中被压缩成 M M M维的信号,这里的 M < N M<N M<N

信号重构过程可以表示为一个优化问题,利用信号的梯度稀疏性质,可以构建目标函数:

min ⁡ x   ∣ ∣ D x ∣ ∣ 1   s . t .   A x = b + e (2) \min_x\ ||Dx||_1\ s.t. \ Ax=b+e\tag{2} xmin ∣∣Dx1 s.t. Ax=b+e(2)

其中, x x x为待求解信号, D D D为全变分算子2。去除约束有

min ⁡ x   λ ∣ ∣ D x ∣ ∣ 1 + 1 2 ∣ ∣ A x − b ∣ ∣ 2 2 (3) \min_x \ \lambda||Dx||_1+\frac12 ||Ax-b||^2_2\tag{3} xmin λ∣∣Dx1+21∣∣Axb22(3)

该问题是一个非凸、不光滑问题,无法直接采用梯度下降法求解。引入变量 d d d,将问题(3)转化为ADMM的一般形式3

min ⁡ x 1 2 ∣ ∣ A x − b ∣ ∣ 2 2 + λ ∣ ∣ d ∣ ∣ 1    s . t .    D x − d = 0 (4) \min_x \frac12 ||Ax-b||^2_2+\lambda||d||_1 \ \ s.t.\ \ Dx-d=0\tag{4} xmin21∣∣Axb22+λ∣∣d1  s.t.  Dxd=0(4)

利用增广拉格朗日法引入凸松弛,同时去除约束条件,有

L ( x , d , μ ) = 1 2 ∣ ∣ A x − b ∣ ∣ 2 2 + λ ∣ ∣ d ∣ ∣ 1 + μ T ( D x − d ) + δ 2 ∣ ∣ D x − d ∣ ∣ 2 2 (5) L(x,d,\mu)=\frac12 ||Ax-b||^2_2+\lambda||d||_1+\mu^T(Dx-d)+\frac \delta 2||Dx-d||^2_2\tag{5} L(x,d,μ)=21∣∣Axb22+λ∣∣d1+μT(Dxd)+2δ∣∣Dxd22(5)

其中 μ \mu μ为拉格朗日乘子, δ > 0 \delta>0 δ>0为拉格朗日惩罚项。为了使表达更简洁,可做如下替换:

L ( x , d , μ ) = 1 2 ∣ ∣ A x − b ∣ ∣ 2 2 + λ ∣ ∣ d ∣ ∣ 1 + δ 2 ∣ ∣ D x − d + p ∣ ∣ 2 2 − δ 2 ∣ ∣ p ∣ ∣ 2 2 (6) L(x,d,\mu)=\frac12 ||Ax-b||^2_2+\lambda||d||_1+\frac \delta 2||Dx-d+p||^2_2-\frac \delta 2||p||_2^2\tag{6} L(x,d,μ)=21∣∣Axb22+λ∣∣d1+2δ∣∣Dxd+p222δ∣∣p22(6)

其中 p = μ / δ p=\mu / \delta p=μ/δ。利用ADMM,问题(6)的求解可通过交替求解以下三个问题进行实现:

x n + 1 = a r g   min ⁡ x   1 2 ∣ ∣ A x − b ∣ ∣ 2 2 + δ 2 ∣ ∣ D x − d n + p n ∣ ∣ 2 2 (7) x_{n+1}=arg\,\min_x\ \frac12 ||Ax-b||^2_2+\frac \delta 2||Dx-d_n+p_n||^2_2\tag{7} xn+1=argxmin 21∣∣Axb22+2δ∣∣Dxdn+pn22(7)

d n + 1 = a r g   min ⁡ u   λ ∣ ∣ d ∣ ∣ 1 + δ 2 ∣ ∣ D x n − d + p n ∣ ∣ 2 2 (8) d_{n+1}=arg\,\min_u\ \lambda||d||_1+\frac \delta 2||Dx_n-d+p_n||^2_2\tag{8} dn+1=argumin λ∣∣d1+2δ∣∣Dxnd+pn22(8)

p n + 1 = p n + ( D x n + 1 − d n + 1 ) (9) p_{n+1}=p_n+(Dx_{n+1}-d_{n+1})\tag{9} pn+1=pn+(Dxn+1dn+1)(9)

2. 仿真结果


测试图像采用的是house,分别测试在20%、40%、60%、80%和100%采样率时,压缩感知重构算法的图像恢复结果。

在这里插入图片描述

从仿真结果可以看到,在20%采样率时,信号的基本轮廓信息就被成功采集了,当采样率达到60%以上时,继续增加采样率并没有使得图像更加的清晰,也就是说,针对这副图像,若采用传统的正交采集的方式,有将近一半的采样资源是被浪费的。

3. MATLAB算法


ratio=0.5;%采样率
x=double(imread('house.bmp'));
[m,n]=size(x);
N=m*n;
M=floor(ratio*N);
A=rand(M,N);%观测矩阵
e=50*randn(M,1);%测量噪声
% 信号采集过程,利用线性投影对信号x进行采集,同时考虑了测量噪声
b=A*reshape(x,N,1)+e;
% 信号重构过程,利用仅有的M个测量值恢复维度为N的信号
x_r=ADMM_TV_reconstruct(A,b,300,500,100);
figure;
subplot(121);
imshow(uint8(x));
title('原始图像');
subplot(122);
imshow(uint8(reshape(x_r,m,n)));
title(sprintf('重构图像(%d%%采样率)',ratio*100));
function xp=ADMM_TV_reconstruct(A,b,delta,lambda,iteratMax)
    [~,N]=size(A);
    [Dh,Dv]=TVOperatorGen(sqrt(N));
    D=sparse([(Dh)',(Dv)']');
    d=D*ones(N,1);
    p=ones(2*N,1)/delta;
    invDD=inv(A'*A+delta*(D'*D));
    for ii=1:iteratMax
        x=invDD*(A'*b+delta*D'*(d-p));
        d=wthresh(D*x+p,'s',lambda/delta);
        p=p+D*x-d;
    end
    xp=x;
end
function [Dh,Dv]=TVOperatorGen(n)
    Dh=-eye(n^2)+diag(ones(1,n^2-1),1);
    Dh(n:n:n^2,:)=0;
    Dv=-eye(n^2)+diag(ones(1,n^2-n),n);
    Dv(n*(n-1)+1:n^2,:)=0;
end

4. 源码地址


https://github.com/dwgan/ADMM_TV_reconstruct

参考文献


  1. Baraniuk, Richard G. “Compressive sensing [lecture notes].” IEEE signal processing magazine 24.4 (2007): 118-121. ↩︎

  2. Rudin, Leonid I., Stanley Osher, and Emad Fatemi. “Nonlinear total variation based noise removal algorithms.” Physica D: nonlinear phenomena 60.1-4 (1992): 259-268. ↩︎

  3. Boyd, Stephen, et al. “Distributed optimization and statistical learning via the alternating direction method of multipliers.” Foundations and Trends® in Machine learning 3.1 (2011): 1-122. ↩︎

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

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

相关文章

Frame Pacing

Frame Pacing是每个游戏都要遇到的问题&#xff0c;这里面有很多细节值得探讨。 为什么需要做Frame Pacing&#xff1f; 从我们的游戏线程渲染一帧到最终屏幕上绘制出一帧不是一个概念&#xff0c;这种间会经历CPU&#xff0c;GPU&#xff0c;屏幕合成器等多个角色的协同工作&a…

【xv6操作系统】安装、运行与调试

一、构建、装入过程 1.编写“启动代码主体代码”&#xff08;在下载的xv6的原始代码上进行修改&#xff09; 2.源代码进行编译、链接生成系统镜像&#xff08;elf格式的目标文件&#xff09; 3.将系统镜像保存起来&#xff08;如保存到磁盘、flash或者网络服务器上&#xff…

上海斯歌K2 x 赛博威 | 战略合作深度交流暨签约仪式

2月16日&#xff0c;上海斯歌K2与赛博威进行了战略合作深度交流&#xff0c;并在赛博威广州科学城办公室举办战略合作签约仪式。 为满足客户在数智化建设过程中的多元化需求&#xff0c;上海斯歌K2与赛博威曾多次产生交集。凭借双方多年合作的良好基础&#xff0c;自2022年始&a…

【C++】右值引用和移动语义(详细解析)

文章目录 1.左值引用和右值引用左值引用右值引用 2.左值引用和右值引用的比较左值引用总结右值引用总结 3.右值引用的使用场景和意义知识点1知识点2知识点3知识点4总结 4.完美转发万能引用见识完美转发的使用完美转发的使用场景 1.左值引用和右值引用 传统的C语法中就有引用的…

【C++】引用 - 基本语法,注意事项,函数参数,函数返回值,本质

文章目录 1. 引用的基本语法2. 引用的注意事项3. 引用做函数参数4. 引用做函数返回值5. 引用的本质6. 常量引用 1. 引用的基本语法 作用是&#xff1a;给变量起别名 语法&#xff1a;数据类型 &别名 原名 2. 引用的注意事项 引用必须初始化引用在初始化后&#xff0c;不…

量子计算:基本概念

选了课程 《量子计算与量子信息》&#xff0c;没学过量子力学的博主实在是听不懂啊 (ㄒoㄒ) 简略整理了下 可能大概也许 明白一二都没有 的课程最开始两节的内容&#xff0c;如有错误欢迎指出 ~ ~ ~ 文章目录 矩阵论复空间中的矩阵矩阵上的运算 量子力学量子态基本假设 量子计算…

阿里云的内容识别技术可以实现哪些场景下的智能化应用?

阿里云的内容识别技术可以实现哪些场景下的智能化应用&#xff1f; [本文由阿里云代理商[聚搜云]撰写]   随着人工智能技术的快速发展&#xff0c;阿里云借助自身的技术和资源优势&#xff0c;开发了一种名为“内容识别”的技术。这项技术能够高效、准确地识别出图片、视频、…

有个规划文档,会让软件开发更有效

有个规划文档&#xff0c;会让软件开发更有效 中小企业&#xff0c;业务部门不太清楚软件生产过程 软件生产有一定的抽象和复杂性 要形成一个共识 趣讲大白话&#xff1a;要有点整体观 【趣讲信息科技181期】 **************************** 2019年整理出了一个目录框架 用在很多…

windows的cmd命令窗口介绍

1.打开cmd 1.1.方式一 左下角搜索&#xff1a;“运行” -> 打开 输入"cmd" -> 确定 1.2.方式二 直接使用快捷键 windows r 即可打开 然后输入cmd&#xff0c;点击确认 1.3.方式三 打开文件管理器&#xff0c;输入cmd&#xff0c;回车 即可在该文件路径下…

统计软件与数据分析Lesson16----pytorch基本知识及模型构建

统计软件与数据分析Lesson16----pytorch基本知识及模型构建 0.上节回顾0.1 一元线性回归数据生成数据处理初始数据可视化 0.2 梯度下降Gradient DescentStep 0: 随机初始化 Random InitializationStep 1: 计算模型预测值 Compute Models PredictionsStep 2: 计算损失 Compute t…

让进程能够“相互沟通”的高级方式一:匿名管道

代码运行及测试环境&#xff1a;linux centos7.6 在阅读这篇文章时&#xff0c;需要掌握OS对文件管理的基础知识&#xff08;文件打开表、文件描述符、索引结点…&#xff09; 前言 我们都知道进程是具有独立性的&#xff0c;意味着进程之间无法相互通信。但在一些情况下&…

当我们谈笔记的时候,我们在谈什么

文章具体内容如图&#xff0c;感谢妙友分享好文&#x1f389; 本篇内容来源于网站Untag Minja 上传的内容《当我们谈笔记的时候&#xff0c;我们在谈什么》 如有侵权请联系删除&#xff01;

如何搭建与使用FTP服务器

一、概述 目前用作搭建FTP服务器端的软件有很多&#xff0c;比如 Vsftpd、ProFTPD、PureFTPd、Wuftpd、ServerU、Filezilla Server等&#xff0c;这里使用Vsftpd进行搭建。 vsftpd 是“very secure ftp daemon”的首字母缩写&#xff0c;它是一款在Linux发行版中最受推崇的免…

应用到vscode

随着ChatGPT的热度持续上升&#xff0c;我们也不得不深刻认识到&#xff0c;这已经势不可挡了。我们必须去接受它&#xff0c;甚至是拥抱它。 私信我可以获取最新包 今天呢&#xff0c;我们要介绍的是vscode的一款插件&#xff0c;叫做ChatGPT&#xff1a; 使用方式 安装完成…

Xshell安装使用教程

简介 Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界面下用来访问远端不…

【C#图解教程】第三章 C#编程概述 笔记总结

程序实例 命名空间一组类型声明 using system&#xff1b;表示使用类型库中的system中的所有类 namespace Myspace{}则会创建一个新的命名空间&#xff0c;这个空间中可以声明该空间的类 SimpleProgram中使用了两个命名空间。先是使用了System命名空间中定义的console类&…

【Linux】项目自动化构建工具-make和Makefile 的使用和进度条的实现

文章目录 一、什么是make/makefile二、如何编写makefile三、make 的工作原理1.make的使用2.make的依赖性3.项目清理4..PHONY伪目标 四、Linux第一个小程序 -- 进度条1.\r&&\n2.行缓冲区概念3.进度条process.hprocesstest.cmakefile 一、什么是make/makefile 什么是mak…

【c语言习题】使用链表解决约瑟夫问题

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

在 Shell 脚本中使用 `exec` 命令的方法和用途

在 Shell 脚本中&#xff0c;exec 是一个非常有用的命令&#xff0c;用于执行命令或替换当前进程。它允许您在脚本中启动新的进程&#xff0c;并将控制权完全转移到新进程。本文将详细介绍在 Shell 脚本中使用 exec 命令的方法和用途。 什么是 Exec 命令&#xff1f; exec 是一…

python基础----02-----字面量、变量、数据类型及其转换、标识符以及字符串、数据输入(input语句)

一 字面量 1 字面量 字面量&#xff1a;在代码中&#xff0c;被写下来的的固定的值称之为字面量。类似C/C的字符串常量。 1.1 常见的python值类型 Python中常见的值类型&#xff1a; 实际上在C/C字面量和这里的类型还是有区别的&#xff0c;体现在内存存储中&#xff0c;字…