图像的压缩感知的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://www.mzph.cn/news/705795.shtml

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

相关文章

Vue-Cropper头像裁剪插件使用

1. 效果预览 2. 插件介绍 官网地址&#xff1a;[GitHub - xyxiao001/vue-cropper: A simple picture clipping plugin for vue](https://github.com/xyxiao001/vue-cropper?fromthosefree.com) 3 . 插件使用 下载插件 npm install vue-croppernext3 . 封装好的代码&#x…

Rider 2023:打造高效.NET项目的智能IDE,让开发更简单mac/win版

JetBrains Rider 2023激活版下载是一款专为.NET开发者打造的强大集成开发环境&#xff08;IDE&#xff09;。这款IDE提供了丰富的功能&#xff0c;旨在帮助开发者更快速、更高效地编写、调试和测试.NET应用程序。 Rider 2023 软件获取 Rider 2023在保持了其一贯的智能代码补全…

RK3568驱动指南|驱动基础进阶篇-进阶4 内核是如何运行ko文件的_insmod

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Kotlin:组合挂起函数

点击查看&#xff1a;组合挂起函数 中文官网 点击查看&#xff1a;组合挂起函数 英文文档 默认顺序调用 假设我们在不同的地方定义了两个进行某种调用远程服务或者进行计算的挂起函数。我们只假设它们都是有用的&#xff0c;但是实际上它们在这个示例中只是为了该目的而延迟了…

PDF文件转换为图片

现在确实有很多线上的工具可以把pdf文件转为图片&#xff0c;比如smallpdf等等&#xff0c;都很好用。但我们有时会碰到一些敏感数据&#xff0c;或者要批量去转&#xff0c;那么需要自己写脚本来实现&#xff0c;以下脚本可以提供这个功能~ def pdf2img(pdf_dir, result_path…

IDEA环境下项目的模块右下角蓝色小方块缺失的解决方法

一、问题描述 该问题的具体表现就如上图一样&#xff0c;模块——”spring-ioc-xml-01“的应该有一个蓝色的方块。现在蓝色方块缺失了之后&#xff0c;我们需要让maven工程重新识别出这个模块。 二、问题分析 出现这种问题的原因&#xff1a;是当前的maven工程没有能够成功的识…

phtread_cancel函数用于取消线程,但不是实时的

如上图所示&#xff0c;线程函数中没有取消点&#xff08;一般是一些系统调用----man 7 pthreads查看&#xff0c;自定义函数是无效的&#xff09;&#xff0c;则使用pthread_cancle函数不生效。 解决方法&#xff1a;可以添加pthread_testcancle(); 通过pthread_join回收的…

为什么要学习PMP知识,PMP培训哪家好?

IT行业项目管理一枚&#xff0c;曾在做技术的时候对自己的职业发展越来越迷茫&#xff0c;不想干到35岁就参与到失业潮中&#xff0c;一直在想着办法提升自己的能力和竞争力&#xff0c;直到在领导嘴里了解到了PMP认证。也就是它对我的职业发展带来了不少的影响&#xff0c;这其…

Python采集二手车数据信息实现数据可视化展示

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 模块使用: requests >>> pip install requests csv 数据可视化: pandas >>> pip install pandas pyech…

自学Python第十五天-常用的HTML解析工具:bs4、xpath、re

自学Python第十五天-常用的HTML解析工具&#xff1a;bs4、xpath、re BS4安装和引入开始使用find_all() 方法获取标签find() 方法获取标签select() 方法获取标签&#xff0c;css 选择器从标签中获取数据 XPathxpath 基础xpath 语法规则lxml 模块xpath() 方法 REmatch() 方法sear…

git配置SSH

gitLab在Cenos7中安装&#xff0c;在Cenos7系统中执行以下操作 1.生成SSH ssh-keygen -t rsa -C xxxxxx.com 然后一路回车,直到出现以下界面为止(-C 参数是邮箱地址) 2.复制SSH 打开/root/.ssh/id_rsa.pub文件&#xff0c;复制其中的内容 在Linux系统中&#xff0c;/root/.…

初谈软件工程(一)

我就读于兰州交通大学的软件工程专业。虽然在全国众多的985、211高校中&#xff0c;兰州交通大学可能并不显眼&#xff0c;似乎未能跻身这些所谓的“顶尖”行列就意味着不被认可。然而&#xff0c;在甘肃省的教育领域中&#xff0c;它无疑是一座璀璨的明珠&#xff0c;名列前茅…

使用R语言进行主成分和因子分析

一、数据描述 数据来源2013年各地区水泥制造业规模以上企业的各主要经济指标&#xff0c;原始数据来源于2014年&#xff08;《中国水泥统计年鉴》&#xff09;&#xff0c;试对用主成分和因子进行经济效益评价。 地区,企业个数&#xff08;亿元&#xff09;,流动资产合计&…

pytest-配置项目不同环境URL

pytest自动化中&#xff0c;在不同环境进行测试&#xff0c;可以将项目中的url单独抽取出来&#xff0c;通过pytest.ini配置文件实现&#xff08;类似postman中的“Environments”&#xff09; 使用步骤&#xff1a; 1&#xff09;安装pytest-base-url插件 pytest-base-url …

阿里云国际云解析DNS如何开启/关闭流量分析?

流量分析服务会涉及产生日志费用&#xff0c;所以开通内网DNS解析服务后&#xff0c;默认不会主动开启流量分析&#xff0c;需要您手动开启流量分析。对于未开启流量分析的用户&#xff0c;进入界面会提示您展示的都是模拟数据&#xff0c;您可以点击开启流量分析服务&#xff…

【pytorch】常用代码

文章目录 条件与概率torch.tensor()torch.rand()torch.randn()torch.randint()torch.multinominal() 逻辑运算torch.argmax()torch.max()torch.sum()torch.tanh()torch.pow() 功能性操作 torch.nn.functionalF.normalize()F.elu()F.relu()F.softmax() 张量计算torch.zeros()tor…

基于JavaWeb实现的校园新闻发布系统

一、系统架构 前端&#xff1a;jsp | bootstrap | js | css 后端&#xff1a;springboot | jdbc 环境&#xff1a;jdk1.6 | mysql | maven 二、 代码及数据库 三、功能介绍 01. web端-首页 02. web端-新闻列表 03. web端-新闻明细 04. 管理端-登录页…

数据可视化引领智慧工业新时代

在智慧工业的大潮中&#xff0c;数据可视化崭露头角&#xff0c;以其直观、清晰的方式赋能工业生产&#xff0c;为智慧工业的高效运转提供了强有力的支持。下面我就以可视化从业者的角度&#xff0c;简单聊聊这个话题。 数据可视化首先在智慧工业的生产监控中大显身手。通过将…

Vue3前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存

MQ功能实现的具体代码(TsMQ.ts)&#xff1a; import { v4 as uuidx } from uuid;import emitter from /utils/mitt// 消息类 class Message {// 过期时间&#xff0c;0表示马上就消费exp: number;// 消费标识&#xff0c;避免重复消费tag : string;// 消息体body : any;constr…

手机打开 第三方 “微信、快手、QQ、电话、信息” 等

前期回顾 Vue3 TS Element-Plus —— 项目系统中封装表格搜索表单 十分钟写五个UI不在是问题_vue3 封装table 配置表格-CSDN博客https://blog.csdn.net/m0_57904695/article/details/135538630?spm1001.2014.3001.5501 目录 &#x1f916; 下载App如下图所示&#xff1a;…