OMP压缩感知仿真(MATLAB)



clc;
clearvars;
close all;

%  读文件
X=imread('mandrill256.bmp');
tic;
X=double(X);
[m,n]=size(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');
% [LL5, LH5, HL5, HH5] = dwt2(LL4, 'haar');

% LL4 = [LL5, LH5; HL5, HH5];
% LL3 = [LL4, LH4; HL4, HH4];
% LL2=[LL3, LH3; HL3, HH3];
LL1=[LL2, LH2; HL2, HH2];
X1=[LL1, LH1; HL1, HH1];

%  随机矩阵生成
M=m/4;
H = hadamard(m);
R = H(1:M,:);

% 将X1更加稀疏化处理
X1_show=X1;
key_value=find_value_at_a_percent(X1,(M/m)/4);
X1(abs(X1)<key_value)=0;


%  测量值
Y=R*X1;

%  OMP算法
%  恢复矩阵
X2=zeros(m,n);
%  按列循环
for i=1:n
    %  通过OMP,返回每一列信号对应的恢复值(小波域)
%         rec=omp(Y(:,i),R,m);
rec=omp(R,Y(:,i),m);
%     rec=ompOptimized(Y(:,i),R,m);
    
    %     rec=orthogonal_matching_pursuit(Y(:,i),R,m);
    %  恢复值矩阵,用于反变换
    X2(:,i)=rec;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 执行逆小波变换
[LL1, LH1, HL1, HH1] = partitionMatrix(X2);
[LL2, LH2, HL2, HH2] = partitionMatrix(LL1);
% [LL3, LH3, HL3, HH3] = partitionMatrix(LL2);
% [LL4, LH4, HL4, HH4] = partitionMatrix(LL3);
% [LL5, LH5, HL5, HH5] = partitionMatrix(LL4);

% 第5级逆变换
% LL4=idwt2(LL5, LH5, HL5, HH5, 'haar');

% 第四级逆变换
% 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');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 显示部分

subplot(2,2,1),imshow(uint8(X));
title('原始图像');
subplot(2,2,2),imshow(X1,[]);
title("X1");
subplot(2,2,3),imshow(X2,[]);
title("X2");
subplot(2,2,4),imshow(uint8(X3),[]);
title('恢复的图像');


%  误差(PSNR)
mypsnr=psnr(uint8(X3),uint8(X));
disp(['psnr:' num2str(mypsnr)]);
toc;

%  OMP的函数
%  s-测量;T-观测矩阵;N-向量大小



function [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

function value_at_a_percent = find_value_at_a_percent(matrix,aPercent)
% 对矩阵进行降序排序
sorted_matrix = sort(matrix(:), 'descend');

% 计算15%位置的索引
num_elements = numel(sorted_matrix);
index_a_percent = ceil(aPercent * num_elements);

% 获取15%位置的值
value_at_a_percent = sorted_matrix(index_a_percent);
end





% OMP算法实现
function x_hat = omp(A, y, M)
    N = size(A, 2);
    x_hat = zeros(N, 1);
    residual = y;
    selected_indices = [];
    tolerance = 1e-6; % 设置残差阈值

    for i = 1:M  % 为避免过拟合,迭代次数不能超过观测数量
        % 计算测量残差的投影
        projections = abs(A' * residual);

        % 选择最大投影对应的索引
        [~, index] = max(projections);

        % 添加选定的原子索引
        selected_indices = [selected_indices, index];

        % 更新估计的稀疏信号
        x_hat(selected_indices) = A(:, selected_indices) \ y;

        % 更新残差
        residual = y - A * x_hat;

        % 检查残差是否足够小//停止条件
        if norm(residual) < tolerance
            break;
        end
    end
end

运行结果

在这里插入图片描述

dct实现



clc;
clearvars;
close all;

%  读文件
X=imread('mandrill256.bmp');
tic;
X=double(X);
[m,n]=size(X);

% %  小波变换矩阵生成
X1=dct2(X);

%  随机矩阵生成
M=m/4;
H = hadamard(m);
R = H(1:M,:);

% 将X1更加稀疏化处理
X1_show=X1;
key_value=find_value_at_a_percent(X1,(M/m)/4);
X1(abs(X1)<key_value)=0;


%  测量值
Y=R*X1;

%  OMP算法
%  恢复矩阵
X2=zeros(m,n);
%  按列循环
for i=1:n
    %  通过OMP,返回每一列信号对应的恢复值(小波域)
%         rec=omp(Y(:,i),R,m);
rec=omp(R,Y(:,i),m);
%     rec=ompOptimized(Y(:,i),R,m);
    
    %     rec=orthogonal_matching_pursuit(Y(:,i),R,m);
    %  恢复值矩阵,用于反变换
    X2(:,i)=rec;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 逆向变换
X3 = idct2(X2);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 显示部分

subplot(2,2,1),imshow(uint8(X));
title('原始图像');
subplot(2,2,2),imshow(X1,[]);
title("X1");
subplot(2,2,3),imshow(X2,[]);
title("X2");
subplot(2,2,4),imshow(uint8(X3),[]);
title('恢复的图像');


%  误差(PSNR)
mypsnr=psnr(uint8(X3),uint8(X));
disp(['psnr:' num2str(mypsnr)]);
toc;

%  OMP的函数
%  s-测量;T-观测矩阵;N-向量大小





function value_at_a_percent = find_value_at_a_percent(matrix,aPercent)
% 对矩阵进行降序排序
sorted_matrix = sort(matrix(:), 'descend');

% 计算15%位置的索引
num_elements = numel(sorted_matrix);
index_a_percent = ceil(aPercent * num_elements);

% 获取15%位置的值
value_at_a_percent = sorted_matrix(index_a_percent);
end





% OMP算法实现
function x_hat = omp(A, y, M)
    N = size(A, 2);
    x_hat = zeros(N, 1);
    residual = y;
    selected_indices = [];
    tolerance = 1e-6; % 设置残差阈值

    for i = 1:M  % 为避免过拟合,迭代次数不能超过观测数量
        % 计算测量残差的投影
        projections = abs(A' * residual);

        % 选择最大投影对应的索引
        [~, index] = max(projections);

        % 添加选定的原子索引
        selected_indices = [selected_indices, index];

        % 更新估计的稀疏信号
        x_hat(selected_indices) = A(:, selected_indices) \ y;

        % 更新残差
        residual = y - A * x_hat;

        % 检查残差是否足够小//停止条件
        if norm(residual) < tolerance
            break;
        end
    end
end

输出

在这里插入图片描述

参考文献:

https://blog.csdn.net/qq_43095255/article/details/135087322

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

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

相关文章

ObjectiveC-07-OOP面向对象程序设计基础

OOP&#xff08;面向对象程序设计&#xff09;是一个简单又复杂的课题&#xff0c;之所以简单是因为其概念清晰&#xff0c;内容简单&#xff0c;之所以复杂是因为没有固定的模式可寻&#xff0c;正所谓千人千面。 从本节开始&#xff0c;笔者大概会用5篇左右不同的专题来讲解O…

虚拟机ip不停地变每次使用ssh不好登录?有手就行!

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 虚拟机ip不停地变每次使用ssh不好登录&#xff1f;有手就行&#xff01; 桥接模式下固定ip&#xff1f;NoAvahi服务&#xff0c;你值得拥有Avahi解决方案虚拟机中配置Avahi服务配置成功展示测试成功 桥…

MySQL故障排查与生产环境优化

一、MySQL逻辑架构图 客户端和连接服务核心服务功能存储引擎层数据存储层 二、MySQL故障排查 1、MySQL单实例故障排查 故障一 故障现象&#xff1a; ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql/mysql.sock (2)问题分析&#xff…

使用Pollard_rho算法分解质因数

分解质因数的朴素算法 最简单的算法即为从 [2, sqrt&#xff08;N&#xff09;] 进行遍历。 vector<int> breakdown(int N) {vector<int> result;for (int i 2; i * i < N; i) {if (N % i 0) { // 如果 i 能够整除 N&#xff0c;说明 i 为 N 的一个质因子。…

求组合背包II(acwing)

题目描述&#xff1a; 给定n组循问&#xff0c;每组询问给定两个整数a&#xff0c;b&#xff0c;请你输出Ca^b mod (1e9 7)的值&#xff0c;。 输入格式&#xff1a; 第一行包含整数n。 接下来2行&#xff0c;每行包含一组a和b。 输出格式&#xff1a; …

Vscode下使用markdown入门

1.安装vscode插件 1. **Markdown All in One** ——提供丰富的Markdown相关的快捷键、自动补全功能&#xff0c;提高md文档编写生产力 2. **Markdown Preview Ehanced** ——用于渲染当前编写文档的效果同步预览 3. **Paste Image** ——用于快速引用图片至Markdown文…

视频素材库有哪些网站?八大平台视频素材库创作推荐

视频创作的小达人们&#xff0c;是不是经常在想&#xff0c;视频素材库有哪些网站能提供高质量的素材呢&#xff1f;别担心&#xff0c;今天我要为你们揭秘八个超棒的视频素材网站&#xff0c;让你的视频制作更加轻松在创作的路上如鱼得水&#xff01; 蛙学网&#xff1a;海量…

【tensorflow框架神经网络实现鸢尾花分类_Keras】

文章目录 1、前言2、鸢尾花分类3、结果打印 1、前言 【tensorflow框架神经网络实现鸢尾花分类】一文中使用自定义的方式&#xff0c;实现了鸢尾花数据集的分类工作。在这里使用tensorflow中的keras模块快速、极简实现鸢尾花分类任务。 2、鸢尾花分类 import tensorflow as t…

.DevicData-P-XXXXXXXX勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒成为了一种日益严重的威胁。.DevicData-P-XXXXXXXX勒索病毒就是其中一种典型的恶意软件&#xff0c;它通过加密用户文件并要求赎金来解锁的方式&#xff0c;给企业和个人带来…

【Java项目】基于SpringBoot的【心灵治愈交流平台】

目录 背景 技术简介 系统简介 界面预览 背景 随着网络不断的普及发展&#xff0c;心灵治愈交流平台依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的首页、系统公告、心理咨询师、心灵专栏、压…

基于springboot实现网上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网上点餐系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统…

【了解下Oracle】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

网络安全入门教程(非常详细)从零基础入门到精通!

网络安全是一个庞大而不断发展的领域&#xff0c;它包含多个专业领域&#xff0c;如网络防御、网络攻击、数据加密等。介绍网络安全的基本概念、技术和工具&#xff0c;逐步深入&#xff0c;帮助您成为一名合格的网络安全从业人员。 一、网络安全基础知识 1.计算机基础知识 …

java(4)之运算符

1、算术运算符 运算符含义表达式加11-减1-1*乘1*2/除2/1%取余5%2 2、赋值运算符 即 表示将右边的值赋给左边的变量 即 int i &#xff1b; i 1&#xff1b; 运算符含义 表达式 x xyxy-x x-yx - y*x x*yx*y/x x/yx /y%x x%yx %y 代码示例 public class Main {pub…

芒果YOLOv5改进89:卷积SPConv篇,即插即用,去除特征图中的冗余,FLOPs 和参数急剧下降,提升小目标检测

芒果专栏 基于 SPConv 的改进结构,改进源码教程 | 详情如下🥇 👉1. SPConv 结构、👉2. CfSPConv 结构 💡本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 即插即用 结构。博客 包括改进所需的 核心结构代码 文件 YOLOv5改进专栏完整目录链接:…

环境配置——已解决ModuleNotFoundError: No module named ‘cv2’(python)

一、报错代码 在网上搜到不少用Python处理图形的代码&#xff0c;于是复制别人的代码直接运行却报错&#xff0c;得到的结果却是&#xff1a;已解决ModuleNotFoundError: No module named ‘cv2’。&#xff08;当时心里瞬间凉了一大截&#xff0c;最后顺利解决了&#xff0c;顺…

配置文件乱码

1、改UTF-8 &#xff08;1&#xff09;已经创建的项目 (2)新项目也改一下

皓学IT:WEB07_ JSP

一、Jsp基础语法 1.1. JSP模板元素 JSP页面中的HTML内容称之为JSP模版元素。 JSP模版元素定义了网页的基本骨架&#xff0c;即定义了页面的结构和外观。 1.2. JSP脚本片段 JSP脚本片断用于在JSP页面中编写多行Java代码&#xff08;在<%%>不能定义方法&#xff09;。…

动手机器学习支持向量机+习题

非参数化模型&#xff0c;当数据集规模增大时&#xff0c;其参数量也相应变多 希望从这无数个可以分隔两个点集的超平面中&#xff0c;挑选出与任意一点间隔&#xff08;margin&#xff09;的最小值最大的平面 支持向量机的数学描述 对上式来说&#xff0c;当w和b的大小同时变…

鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

CPU密集型任务是指需要占用系统资源处理大量计算能力的任务&#xff0c;需要长时间运行&#xff0c;这段时间会阻塞线程其它事件的处理&#xff0c;不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多线程并发机制处理CPU密集型任务可以提高CPU利用率&#x…