图像的压缩感知的MATLAB实现(第3种方案)

前面介绍了两种不同的压缩感知实现:
图像压缩感知的MATLAB实现(OMP)
压缩感知的图像仿真(MATLAB源代码)

上述两种方法还存在着“速度慢、精度低”等不足。
本篇介绍一种新的方法。

压缩感知(Compressed Sensing)是一种信号处理技术,旨在通过取样和重构过程中的稀疏性或低维性的先验知识,从少量的测量数据中恢复原始信号。与传统的信号采样方式相比,压缩感知可以以更低的采样率获取信号,并在一定程度上保持较高的重构质量。

以下是压缩感知的一些重要知识点:

  1. 稀疏性:压缩感知假设信号在某个表示域下是稀疏的,即信号能够用较少的非零系数表示。这意味着信号的大部分能量集中在少数几个基函数上,而其他系数很接近于零。

  2. 测量矩阵:压缩感知使用一个测量矩阵来计算信号的投影测量。测量矩阵可以是随机矩阵或基于不同的测量方法生成的。测量矩阵的选择对于压缩感知的性能具有重要影响。

  3. 重构算法:压缩感知利用稀疏表示的先验知识,通过最小化正则化函数来恢复原始信号。常用的重构算法包括基于L1范数的贪婪迭代算法(如OMP、CoSaMP)、基于迭代阈值的算法(如IST、FISTA)和基于凸优化的算法(如基于内点法的L1优化)。

  4. 重构性能:压缩感知的重构性能用于衡量在给定的测量数量下,重构的信号与原始信号之间的误差。重构性能受到信号的稀疏度、测量矩阵的设计和重构算法的选择等因素的影响。

MATLAB和其他数学软件提供了用于压缩感知的工具箱和函数,如 l1magicSPGL1。这些函数可以用于生成测量矩阵、实现重构算法,并进行压缩感知的仿真和实验。

压缩感知在图像处理、语音信号处理、雷达成像、医学成像等领域都得到了广泛的应用。它提供了一种新的思路和方法,可以在低采样率下实现高质量的信号重构,并对传统信号采样理论进行了一定的突破。

MATLAB实现

针对网络上沙威老师的代码中所使用小波变换进行了修改。
将其中自定义的dwt函数修改了了使用MATLAB自带的dwt2函数。

MATLAB代码

MATLAB代码实现如下:


clc;clear%  读文件
X=imread('lenagray.bmp');
X=double(X);
[a,b]=size(X);% %  小波变换矩阵生成
% ww=DWT(a);
% % ww=a;
% %
% % %  小波变换让图像稀疏化(注意该步骤会耗费时间,但是会增大稀疏度)
% X1=ww*sparse(X)*ww';
% % % X1=X;
% X1=full(X1);
%
% X1=X;[LL1, LH1, HL1, HH1] = dwt2(X, 'haar');
[LL2, LH2, HL2, HH2] = dwt2(LL1, 'haar');
[LL3, LH3, HL3, HH3] = dwt2(LL2, 'haar');
[LL4, LH4, HL4, HH4] = dwt2(LL3, 'haar');LL3 = [LL4, LH4; HL4, HH4];
LL2=[LL3, LH3; HL3, HH3];
LL1=[LL2, LH2; HL2, HH2];
X1=[LL1, LH1; HL1, HH1];%  随机矩阵生成
M=190;
R=randn(M,a);
% R=mapminmax(R,0,255);
% R=round(R);%  测量值
Y=R*X1;%  OMP算法
%  恢复矩阵
X2=zeros(a,b);
%  按列循环
for i=1:b%  通过OMP,返回每一列信号对应的恢复值(小波域)rec=omp(Y(:,i),R,a);%  恢复值矩阵,用于反变换X2(:,i)=rec;
end%  原始图像
figure(1);
imshow(uint8(X));
title('原始图像');%  变换图像
figure(2);
imshow(uint8(X1));
title('小波变换后的图像');%  压缩传感恢复的图像
figure(3);
%  小波反变换
% X3=ww'*sparse(X2)*ww;
% X3=X2;
% X3=full(X3);
% X3=idwt2(X2);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 执行逆小波变换
[LL1, LH1, HL1, HH1] = partitionMatrix(X2);
[LL2, LH2, HL2, HH2] = partitionMatrix(LL1);
[LL3, LH3, HL3, HH3] = partitionMatrix(LL2);
[LL4, LH4, HL4, HH4] = partitionMatrix(LL3);% 第四级逆变换
LL3 = idwt2(LL4, LH4, HL4, HH4, 'haar');% 第三级逆变换
LL2= idwt2(LL3, LH3, HL3, HH3, 'haar');% 第二级逆变换
LL1 = idwt2(LL2, LH2, HL2, HH2, 'haar');% 第一级逆变换,得到原始图像
X3 = idwt2(LL1, LH1, HL1, HH1, 'haar');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%imshow(uint8(X3));
title('恢复的图像');%  误差(PSNR)
%  MSE误差
errorx=sum(sum(abs(X3-X).^2));
%  PSNR
psnr=10*log10(255*255/(errorx/a/b))%  OMP的函数
%  s-测量;T-观测矩阵;N-向量大小
function hat_y=omp(s,T,N)
Size=size(T);                                     %  观测矩阵大小
M=Size(1);                                        %  测量
hat_y=zeros(1,N);                                 %  待重构的谱域(变换域)向量
Aug_t=[];                                         %  增量矩阵(初始值为空矩阵)
r_n=s;                                            %  残差值for times=1:M;                                  %  迭代次数(稀疏度是测量的1/4)for col=1:N;                                  %  恢复矩阵的所有列向量product(col)=abs(T(:,col)'*r_n);          %  恢复矩阵的列向量和残差的投影系数(内积值)end[val,pos]=max(product);                       %  最大投影系数对应的位置Aug_t=[Aug_t,T(:,pos)];                       %  矩阵扩充T(:,pos)=zeros(M,1);                          %  选中的列置零(实质上应该去掉,为了简单我把它置零)aug_y=(Aug_t'*Aug_t)^(-1)*Aug_t'*s;           %  最小二乘,使残差最小r_n=s-Aug_t*aug_y;                            %  残差pos_array(times)=pos;                         %  纪录最大投影系数的位置if (norm(r_n)<0.9)                            %  残差足够小break;end
end
hat_y(pos_array)=aug_y;                           %  重构的向量endfunction [X1, X2, X3, X4] = partitionMatrix(X)
% 获取矩阵X的大小
[m, n] = size(X);% 将矩阵X划分为四等份
X1 = X(1:m/2, 1:n/2); % 左上角子矩阵
X2 = X(1:m/2, n/2+1:end); % 右上角子矩阵
X3 = X(m/2+1:end, 1:n/2); % 左下角子矩阵
X4 = X(m/2+1:end, n/2+1:end); % 右下角子矩阵
end

输出结果

输出结果如下,效果一般,而且速度较慢。

在这里插入图片描述

参考知识点

MATLAB小波变换函数

小波变换是一种信号处理技术,通过在时间-频率域中使用基于小波的函数进行信号分析。小波变换在处理非平稳信号和图像时特别有用,可以将信号分解为不同频率的成分。它在数据压缩、去噪、特征提取等领域有广泛应用。

MATLAB中提供了用于二维离散小波变换的函数 dwt2,可以将图像进行小波分解。该函数执行的是多级离散小波变换,将图像分解为多个尺度的近似系数和细节系数。具体来说,dwt2函数的语法如下:

[C, S] = dwt2(X, wavelet)

其中,

  • X 是输入的二维图像;
  • wavelet 是指定的小波基函数,比如 'haar''db1' 等;
  • C 是包含小波变换系数的矩阵;
  • S 是描述小波变换结果各层的结构体。

你可以通过调用dwt2函数来执行二维离散小波变换,得到图像的小波分解系数和结构信息。然后,你可以进一步对获得的系数进行处理,比如重构原始图像、进行图像压缩、图像增强等。

需要注意的是,小波变换是一种复杂的信号处理技术,需要一定的理论基础和实践经验来使用和理解。

自定义函数

网络上沙威老师的dwt版本如下:

function ww=DWT(N)
[h,g]=wfilters('haar','d');      %  分解低通和高通滤波器
% N=256;                           %  矩阵维数(大小为2的整数幂次)
L=length(h);                       %  滤波器长度
rank_max=log2(N);                  %  最大层数
rank_min=double(int8(log2(L)))+1+3;  %  最小层数
ww=1;   %  预处理矩阵
%  矩阵构造
for jj=rank_min:rank_maxnn=2^jj;%  构造向量p1_0=sparse([h,zeros(1,nn-L)]);p2_0=sparse([g,zeros(1,nn-L)]);%  向量圆周移位for ii=1:nn/2p1(ii,:)=circshift(p1_0',2*(ii-1))';p2(ii,:)=circshift(p2_0',2*(ii-1))';end%  构造正交矩阵w1=[p1;p2];mm=2^rank_max-length(w1);w=sparse([w1,zeros(length(w1),mm);zeros(mm,length(w1)),eye(mm,mm)]);ww=ww*w;clear p1;clear p2;
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://xiahunao.cn/news/2809567.html

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

相关文章

macOS系统下载IDEA的操作流程

第一步 进入官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 第二步 根据mac的芯片选择版本下载 芯片的查看位置是【设置】-【通用】-【关于本机】-第二个&#xff0c;我的是Apple芯片&#xff0c;选Apple Silicon -- 第三步 右上角下载处打开安装包&…

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

第十三章 Linux——备份与恢复

第十三章 Linux——备份与恢复 基本介绍安装dump和restore使用dump完成备份dump语法说明dump应用案例1dump应用案例2dump-w查看备份时间文件备份文件或者目录备注 使用restore基本语法基本介绍restore基本语法应用案例1应用案例2应用案例3应用案例4 基本介绍 实体机无法做快照…

SpringBoot:数据访问-整合 spring-boot-starter-data-jpa

点击查看数据访问demo&#xff1a;LearnSpringBoot06DataJPA Spring Data JPA - Reference 文档 简介 Spring Data的JPA模块包含一个允许定义存储库bean的自定义名称空间。它还包含JPA特有的某些特性和元素属性。通常&#xff0c;可以使用repositories元素来设置JPA存储库: 点…

学习使用在mysql中查询指定字段字符串包含多个字符串的方法

学习使用在mysql中查询指定字段字符串包含多个字符串的方法 使用LIKE关键字使用REGEXP关键字使用FIND_IN_SET函数使用INSTR函数和AND关键字 使用LIKE关键字 SELECT * FROM table_name WHERE column_name LIKE %string1% AND column_name LIKE %string2%;使用LIKE关键字&#x…

异常统一处理:Exception(兜底异常)

一、引言 本篇内容是“异常统一处理”系列文章的重要组成部分&#xff0c;主要聚焦于对 Exception&#xff08;兜底异常&#xff09; 的原理解析与异常处理机制&#xff0c;并给出测试案例。 关于 全局异常统一处理 的原理和完整实现逻辑&#xff0c;请参考文章&#xff1a; 《…

yolov8学习笔记(二)模型训练

目录 yolov8的模型训练 1、制作数据集&#xff08;标记数据集&#xff09; 2、模型训练&#xff08;标记数据集、参数设置、跟踪模型随时间的性能变化&#xff09; 2.1、租服务器训练 2.2、加训练参数 2.3、看训练时的参数&#xff08;有条件&#xff0c;就使用TensorBoard&…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇

1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo&#xff0c;然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试&#xff0c;想必大家都已经掌握的八九不离十了吧。这一篇其实也很简单&#xff1a…

JavaSE——面向对象基础(4/4)-成员变量和局部变量的区别、面向对象综合案例(电影信息系统)

目录 补充&#xff1a;成员变量和局部变量的区别 面向对象综合案例 设计一个电影类 IDEA快捷操作 设计一个电影操作类 准备电影数据 业务处理 运行结果 补充&#xff1a;成员变量和局部变量的区别 区别成员变量&#xff08;对象的属性&#xff09;局部变量类中位置不同…

Project_Euler-07 题解

Project_Euler-07 题解 题目 思路 一个线性筛解决问题&#xff0c;当然也可以用埃式筛或者标准的暴力破解&#xff0c;这里选用最优秀的方式&#xff0c;顺便复习一下线性筛的内容&#xff1a; #include<stdio.h> #include<stdlib.h> #include<math.h> #in…

spring源码概念解析-spring生命周期

1.Spring生命周期 BeanFactory的⽣命周期 ApplicationContext的⽣命周期 初始化的过程都是⽐较⻓&#xff0c;我们可以分类来对其进⾏解析&#xff1a; Bean⾃身的⽅法&#xff1a;如调⽤ Bean 构造函数实例化 Bean&#xff0c;调⽤ Setter 设置 Bean 的属性值以及通 过的 in…

matlab新能源汽车三自由度操纵稳定性分析及优化

1、内容简介 略 可以交流、咨询、答疑 55-新能源汽车三自由度操纵稳定性分析及优化 2、内容说明 略 摘 要 电动化是节能减排、寻求替代能源的最佳途径&#xff0c;已成为行业共识&#xff0c;论文基于江西科技学院桑塔纳轿车油改气项目&#xff0c;在拆除发动机、变速…

Unity(第六部)向量的理解和算法

标量:只有大小的量。185 888 999 &#xff08;类似坐标&#xff09; 向量:既有大小&#xff0c;也有方向。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米&#xff09; 向量的模:向量的大小。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米、只取一百米…

【Crypto | CTF】BugKu 简单的RSA

天命&#xff1a;这题也不算简单了&#xff0c;要反编译&#xff0c;要灵活一点 首先收到pyc文件&#xff0c;拿去反编译出来&#xff0c;可以用在线反编译&#xff0c;也可以用工具反编译 在线&#xff1a;python反编译 - 在线工具 工具&#xff1a;https://download.csdn.n…

基于Java的传统工艺品销售系统的设计与实现

网上购物尚未流行前需要购买传统工艺品的人们都是到遍布于大街小巷的商场商店中进行挑选购买&#xff0c;除非抱有非常明确的目标&#xff0c;否则是很难在短时间内挑选购买到所需传统工艺品的。网上购物在国内的兴起则彻底颠覆了传统的线下购物模式&#xff0c;线下实体商场也…

Git命令操作

什么是Git&#xff1f; Git是⼀个免费的&#xff0c;开源的分布式版本控制软件系统 git区域 存储区域&#xff1a;Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域&#xff1a;Git软件对外提供资源得区域&#xff0c;此区域可⼈⼯对资源进⾏处理。 暂存区&am…

中海油、中石化、中石油校招历年真题和题库

中海油、中石化、中石油是中国领先的石油和天然气公司&#xff0c;拥有雄厚的实力和丰富的资源&#xff0c;是许多求职者梦寐以求的就业机会。为了帮助应聘者更好地备战这三家公司的校园招聘&#xff0c;我特别整理了三套精心准备的校招试题资料&#xff0c;涵盖了各个领域的知…

【计算机网络】1.4 接入网和物理媒体

1.4 接入网和物理媒体 问题&#xff1a;怎样将端系统和边缘路由器连接&#xff1f; 答&#xff1a;有线方式&#xff08;住宅接入网络、单位接入网络等&#xff09;或无线方式&#xff08;无线接入网络&#xff09;。 有线接入方式 光纤同轴混合网是基于已有的有线电视网开发的…

五种多目标优化算法(MOHHO、MOCS、MOFA、NSWOA、MOAHA)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤&#xff1a; 1. 定义问题&#xff1a;首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数&#xff0c;这些目标函数可能…

基于相位的运动放大:如何检测和放大难以察觉的运动(02/2)

目录 一、说明二、算法三、准备处理四、高斯核五、带通滤波器六、复杂的可操纵金字塔七、最终预处理步骤八、执行处理九、金字塔的倒塌十、可视化结果十一、结论 一、说明 日常物体会产生人眼无法察觉的微妙运动。在视频中&#xff0c;这些运动的幅度小于一个像素&#xff0c;…