OMP压缩感知仿真(MATLAB)

news2024/10/5 21:17:29


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

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

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

相关文章

Demis Hassabis,这位被封为爵士的AI领域的杰出研究者和神经科学家,是否能成为Google的救星?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Jquery——js库

1. jQuery 基础操作 jQuery 是一个快速、小巧的 JavaScript 库&#xff0c;设计用于简化 HTML 文档的遍历、事件处理、动画设计和 Ajax 交互。jQuery 使用户能够更快地编写 JavaScript 代码&#xff0c;并且能够更容易地处理 HTML 文档、事件、动画和 Ajax。 加载 jQuery 要…

HDLbits 刷题 -- Alwaysblock2

学习&#xff1a; For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*)Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but…

【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲

与一般的Dataloader的区别在于我们对图像进行了随机裁剪&#xff0c;需要进行额外的操作才能将其打包到dataloader里面 这一段的代码如下&#xff1a; if args.distributed:sampler_train DistributedSampler(dataset_train)sampler_val DistributedSampler(dataset_val, shu…

LeetCode-48. 旋转图像【数组 数学 矩阵】

LeetCode-48. 旋转图像【数组 数学 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;一行代码&#xff01;Python zip函数图一乐【zip函数实现主对角线翻转&#xff0c;[::-1]实现垂直翻转】解题思路二&#xff1a;其实我们也可以先水平轴翻转&#xff0c;让后主对角线翻转。…

Linux之用户账号、用户组和与账号有关的系统文件

目录 一、基本介绍 1.用户和用户组 2.UID和GID 二、 账户管理 1.查看用户的UID和GID 2.添加账户 3.删除账号 4.修改账号 5.账户口令 三、分组管理 1.新增用户组 2.删除用户组 3.修改用户组 4.用户组切换 四、与账号有关的系统文件 1./etc/passwd 2./etc/shado…

LeetCode_33_中等_搜索旋转排序数组

文章目录 1. 题目2. 思路及代码实现详解&#xff08;Python&#xff09;2.1 二分查找 1. 题目 整数数组 n u m s nums nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c; n u m s nums nums 在预先未知的某个下标 k &#xff08; 0 < k…

python_绘图_多条折线图绘制_显示与隐藏

1. 需求 给定一个二维数组 100行, 5列, 每一列绘制一条折线, 横轴为行索引, 纵轴为对应位置的值, 绘制在一个子图里面, 使用python plot, 使用随机颜色进行区别添加显示和隐藏按钮, 可以对每条折线进行显示和隐藏 2. 代码 import numpy as np import matplotlib.pyplot as p…

使用Docker快速搭建Kafka

前言 今天讲下如何使用Docker快速搭建kafka。 前期准备&#xff0c;需要安装好docker、docker-compose。 一、安装Kafka 1、创建Kafka目录&#xff0c;执行如下命令。 mkdir -p /docker/kafka/ cd /docker/kafka/ 2、编写yaml文件&#xff0c;内容如下。 vim docker-com…

国产桌面操作系统统一身份认证及2FA双因子认证安全升级方案

某金融运营服务公司&#xff0c;主要负责业务处理、客户服务、业务监控、报表统计等金融运营服务&#xff0c;为集团下设二级单位&#xff0c;坐落于一线城市&#xff0c;对政策风向有很高的敏锐度。 该公司已为公司业务人员、客户服务、监督员等配备了数百台国产桌面操作系统…

springboot 将manage关闭。

这是SpringBoot自带的接口&#xff0c;会将所有的接口暴露在外面。所以我们上生产环境&#xff0c;需要将这个接口给关闭。 默认是 management.endpoints.web.exposure.include* 只需将配置文件改成下面&#xff0c;Springboot自带的接口就会关闭。 management.endpoints.…

嵌入式系统基础知识(一):嵌入式系统是什么?

一.定义 根据IEEE&#xff08;国际电气和电子工程师协会&#xff09;的定义&#xff0c;嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”。这主要是从应用上加以定义的&#xff0c;从中可看出嵌入式系统是软件和硬件的综合体&#xff0c;还可以涵盖机械等附属装…

vue3使用UEditorPlus 、后端配置、上传图片等处理

前端安装 vue3安装vue-ueditor-wrap // vue-ueditor-wrap v3 仅支持 Vue 3 npm i vue-ueditor-wrap3.x -S // or yarn add vue-ueditor-wrap3.x 下载 UEditorPlus 仓库地址 把dist文件复制到vue3项目中的public下&#xff0c;重命名为UEditorPlus UEditorPlus文档 在main.…

分月饼 java题解

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in); int m sc.nextInt(); // 读取员工数量mint n sc.nextInt(); // 读取月饼数量n// 调用distribute方法并打印返回的分配方法总数//先默认每人分一个…

联手SCQL与CCL,护航隐私计算之路

1.SCQL Overview SCQL&#xff08;Secure Collaborative Query Language&#xff09;是一种专为支持多方安全数据分析而设计的语言&#xff0c;它的目标是在保证数据隐私的前提下&#xff0c;使得不同的参与方能够进行联合数据分析。这一概念和技术是随着隐私计算技术的发展而…

顶顶通呼叫中心中间件-声音编码自适应配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-声音编码自适应配置方法讲解(mod_cti基于FreeSWITCH) 声音编码自适应介绍 声音编码自适应&#xff0c;通常在语音通信和音频处理领域中指的是一种能够根据信号特性和传输环境自动调整编码参数的技术。其目的是在不同的网络状况和音质要求下&#xff0c;…

3、jvm基础知识(三)

如何判断堆上的对象没有被引用&#xff1f; 常见的有两种判断方法&#xff1a;引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&#xff0c;取消引用时减1。 引用计数法的优点是实现简单&#xff0c;缺点有两点&#xff1…

【浅尝C++】STL第二弹=>迭代器失效详解/vector常用接口使用示例/vector底层结构探索/vector模拟实现代码详解

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f3af;每日格言&#xff1a;每日努力一点点&#xff0c;技术变化看得见。 文章目录 vector介绍vector常用接口及使用示例构造类函数迭代器的使用容量操作增删改查 迭代器失效详解与v…

ArcGIS支持下SWAT与CENTURY模型的结合:流域水碳氮综合模拟

目录 专题一 流域水碳氮建模 专题二 数据准备 专题三 流域水模拟 专题四 流域氮模拟 专题五 流域碳模拟 专题六 模型结果分析及地图制作 更多应用 基于ArcGIS的SWAT模型是一类比较典型的流域模型&#xff0c;结合SWAT模型和生物地球化学循环模型可以实现流域水碳氮综合模…

通过 Cookie、Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(一)

本篇博客对应“2.3 会话管理”小节 视频名称&#xff1a;会话管理 视频链接 什么是HTPP协议&#xff1f; HTTP&#xff0c;Hpyer Text Transfer Protocl&#xff1a;定义了浏览器怎样从&#xff08;万维网客户进程&#xff09;怎样向Web服务器&#xff08;万维网服务器&#…