在matlab和opencv中分别实现稀疏表示

2023-12-19

在本文中,稀疏表示的原理不再具体讲解,有需要的同学请自行百度。

本文采用OMP算法来求解稀疏系数。首先随机生成字典数据和待测试数据

字典数据:

dic =[  
   6,   7,   9,   9,   7,   0,   6,   3,   6,   9;
   1,   8,   7,   8,   5,   3,   8,   1,   7,   3;
   3,   3,   5,   4,   8,   2,   6,   1,   2,   2;
   6,   1,   0,   7,   3,   5,   0,   6,   3,   3;
   7,   5,   0,   5,   3,   0,   2,   7,   1,   7];

这是一个5*10的矩阵,行数代表维度,列数代表样本数。列数在字典中也叫字典原子,此处有10个原子,原子数大于维数,符合过完备要求。

信号数据:

signal=[  9;   8;   8;   3;   9];

为了简便,只模拟了一个信号数据,是一个5*1的矩阵,如果有多个数据,则应该是5*n的矩阵。求解的时候,可用循环求解。

一、在matlab中实现稀疏表示,求解稀疏系数

clc;close all;clear all;
dic =[  
   6,   7,   9,   9,   7,   0,   6,   3,   6,   9;
   1,   8,   7,   8,   5,   3,   8,   1,   7,   3;
   3,   3,   5,   4,   8,   2,   6,   1,   2,   2;
   6,   1,   0,   7,   3,   5,   0,   6,   3,   3;
   7,   5,   0,   5,   3,   0,   2,   7,   1,   7];    %字典
signal=[  9;   8;   8;   3;   9];    %原始信号 
dic=dic*diag(1./sqrt(sum(dic.^2)));  %字典原子单位化,即每列的norm为1
signal=signal/norm(signal);  %信号单位化
[A,res]=OMP(dic,signal,6);  %稀疏度设定为6,即非零元素最多为6个
A  %输出系数
res  %输出残差
epsilon=norm(signal-dic*A)  %验证残差  ||Y-Dx||2

其中OMP算法:

%OMP计算稀疏系数
function [A,res]=OMP(D,X,L)
% 输入参数:
%       D - 过完备字典,注意:必须字典的各列必须经过了规范化
%       X - 信号
%       L - 稀疏度,系数中非零元个数的最大值
% 输出参数:
%       A - 当前信号的系数
%       res - 残差

%%
residual=X; %初始化残差
indx=zeros(L,1);
for i=1:L,
    proj=D'*residual;%D转置与residual相乘,得到与residual与D每一列的内积值
    [~,pos]=max(abs(proj));%找到内积最大值的位置
    pos=pos(1);%若最大值不止一个,取第一个
    indx(i)=pos;%将这个位置存入索引集的第j个值
    a=pinv(D(:,indx(1:i)))*X;%indx(1:j)表示第一列前j个元素
    residual=X-D(:,indx(1:i))*a;
    res=norm(residual);
    if res< 1e-6
        break;
    end
end
A=zeros(size(D,2),1);
A(indx(indx~=0))=a;
end

结果:

A =

    0.1450
    0.9391
         0
         0
    0.4210
    0.1049
         0
         0
   -0.5503
         0


res =

   3.1402e-16


epsilon =

   3.1402e-16

从系数中可以看出,从10个原子共选出了5个原子进行表示,最后的残差非常小,说明稀疏表示的结果和原数据非常接近。 基于纹理特征的稀疏表示分类

二、在opencv2中实现稀疏表示

void getData(Mat &data, Mat &signal);
int main(int argc, char* argv[])
{
    Mat dic, signal;
    getData(dic, signal);  //获取模拟数据
    Mat temp(1, dic.cols, CV_32F);  //用一个矩阵保存每个原子的模长
    for (int i = 0; i<dic.cols; i++)
    {
        temp.col(i) = norm(dic.col(i));  //每个原子的模长
    }
    divide(dic, repeat(temp, dic.rows, 1), dic); //字典原子单位化
    signal = signal / norm(signal);  //信号单位化
    Mat A=src.OMP(dic, signal, 8);  //调用OPM求解
    float res =(float)norm(signal - dic*A); //计算残差
    cout << "系数:" <<endl<< A << endl;
    cout<<endl<<"残差:"<< endl<<res << endl; //输出残差
    waitKey(0);
    return 0;
}
void getData(Mat &dic, Mat &signal)
{
    dic = (Mat_<float>(5, 10) <<
        6, 7, 9, 9, 7, 0, 6, 3, 6, 9,
        1, 8, 7, 8, 5, 3, 8, 1, 7, 3,
        3, 3, 5, 4, 8, 2, 6, 1, 2, 2,
        6, 1, 0, 7, 3, 5, 0, 6, 3, 3,
        7, 5, 0, 5, 3, 0, 2, 7, 1, 7);
    signal = (Mat_<float>(5, 1) << 9, 8, 8, 3, 9);
}

其中,OMP函数为:

Mat SRC::OMP(Mat& dic, Mat& signal,int sparsity)

{
    if (signal.cols>1)
    {
        cout << "wrong signal" << endl;
        exit(-1);
    }
    vector<int> selectedAtomOrder;   //保存所有选出的字典原子序号
    Mat coef(dic.cols, 1, CV_32F, Scalar::all(0)); //需要返回的系数    
    Mat residual = signal.clone();  //初始化残差
    Mat indx(0, 1, CV_32F);//初始化临时系数
    Mat phi;    //保存已选出的原子向量
    float max_coefficient;
    unsigned int atomOrder;  //每次所选择的原子的序号

    for (;;)
    {
        max_coefficient = 0;
        //取出内积最大列
        for (int i = 0; i <dic.cols; i++)
        {
            float coefficient = (float)dic.col(i).dot(residual);

            if (abs(coefficient) > abs(max_coefficient))
            {
                max_coefficient = coefficient;
                atomOrder = i;
            }
        }
        selectedAtomOrder.push_back(atomOrder); //添加选出的原子序号        
        Mat& temp_atom = dic.col(atomOrder); //取出该原子
        if (phi.cols == 0)
            phi = temp_atom;
        else
            hconcat(phi, temp_atom, phi); //将新原子合并到原子集合中(都是列向量)

        indx.push_back(0.0f);    //对系数矩阵新加一项
        solve(phi, signal, indx, DECOMP_SVD);    //求解最小二乘问题
        residual = signal - phi*indx;  //更新残差
        float res_norm = (float)norm(residual);
        if (indx.rows >= sparsity || res_norm <= 1e-6) //如果残差小于阈值或达到要求的稀疏度,就返回
        {
            for (int k = 0; k < selectedAtomOrder.size(); k++)
            {
                coef.row(selectedAtomOrder[k]).setTo(indx.row(k));  //得到最终的系数
            }
            return coef;
        }
    }
}

最终输出结果为:

系数:
[0.14503297;
 0.9391216;
 0;
 0;
 0.42096639;
 0.1048916;
 0;
 0;
 -0.55029994;
 0]

残差:
1.70999e-007

看以看出,opencv得到的系数和matlab得到的系数基本是一样,只是小数点后保留的位数区别。因为小数位数不相同,所以最后残差有点不同,但不影响最终结果,我们只需要系数相同即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在matlab和opencv中分别实现稀疏表示 的相关文章

  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • 多视图几何

    我从相距一定距离的两台相同品牌的相机捕获了两张图像 捕获了相同的场景 我想计算两个相机之间的现实世界旋转和平移 为了实现这一点 我首先提取了两张图像的 SIFT 特征并进行匹配 我现在有基本矩阵也单应性矩阵 然而无法进一步进行 有很多混乱
  • 非模态 questdlg.m 提示

    我的代码绘制了一个图 然后提示用户是否想使用不同的参数绘制另一个图 问题是 当 questdlg m 打开时 用户无法查看绘图的详细信息 这是代码 while strcmp Cont Yes 1 Some code modifying da
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • 当我将鼠标移到 Mat 关键字上时,Visual Studio 2017 冻结(OpenCv 3.4.1)

    我想在 Visual Studio 2017 中开发 openCv 项目 我下载了 opencv 预构建库并进行了必要的设置 那是 1 我添加了系统路径 build x64 vc14 bin 2 在 Visual Studio 中的项目属性
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • OpenCV 2.3 与 VS 2008 - 鼠标事件

    强制性 我是新手 有一份涉及编程的工作 并且我一边工作一边自学 不用说 作为一名老师 我经常犯彻底的错误 我现在所处的位置 我创建了 Graph 类 它 令人惊讶的是 制作了图表 但现在我想通过单击鼠标来修改图形 但我似乎无法让鼠标处理程序
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d

随机推荐

  • 讲解module ‘tensorflow‘ has no attribute ‘Session‘

    目录 讲解module tensorflow has no attribute Session 错误原因 解决方案 总结 讲解module tensorflow has no attribute Session 在使用TensorFlow进
  • 广州软件第三方测试报告需要盖CNAS\CMA吗?怎么取费?

    CNAS CMA资质 1 CMA资质标识 根据报告接收方要求 第三方测试报告上是否加盖CMA标识 第三方测试机构执行标准为GB T25000 51和GB T25000 10标准 2 CNAS标识 ILAC MRA国际互认标识 通常第三方测试
  • SDN前沿技术【SMaRT-5G项目】

    目录 引言 节能方法 快速了解投资回报率 ROI ONF SMaRT 5G Initiative RAN 能量优化 方法 电池开 关方法 MIMO 睡眠和 RF 通道打开 关闭 高级睡眠模式 ASM RAN节能解决方案的
  • 【最新】2023年30米分辨率土地利用遥感监测数据

    改革开放以来 中国经济的快速发展对土地利用模式产生了深刻的影响 同时 中国又具有复杂的自然环境背景和广阔的陆地面积 其土地利用变化不仅对国家发展 也对全球环境变化产生了深刻的影响 为了恢复和重建我国土地利用变化的现代过程 更好地预测 预报土
  • Dubbo 注册中心挂了,consumer 还能不能调用 provider?

    在 Dubbo 中 如果注册中心 如 Zookeeper Nacos 等 出现故障 消费者 consumer 仍然可以调用提供者 provider 的服务 但需要满足以下条件 消费者和提供者之间的通信配置正确 消费者需要知道提供者的地址和端
  • Clion远程开发无法解析头文件,但是代码可以正常编译运行

    问题 当我在使用Clion进行远程开发时 需要用到Opencv库 我首先在CMakeLists txt添加了opencv库 如下 find package OpenCV REQUIRED INCLUDE DIRECTORIES OpenCV
  • 天眼情报分析——问题收集

    分为几类 一 代码实现问题 1 将两个字符串交替合并 这段代码错在逻辑错误 由于w1此时小于w2剩下的部分应该是w2而不是w1 我分析这位星友错误的原因应该是对底层逻辑实现没有深入理解 学到了不少 多多交流是好事 二 如何使用GitHub
  • NFS原理详解

    一 NFS介绍 1 什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录 NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中 在本地的NFS客户端的机器看来 NFS服务器端共享
  • Java是怎么运行起来的?深入理解Java虚拟机

    介绍Java的工作原理和JVM的内部结构 微信搜索关注 Java学研大本营 Java虚拟机 JVM 是一个运行时环境 可以执行用Java编程语言编写的程序 Java语言是一种高级语言 它通过抽象和封装的机制 让开发者可以专注于业务逻辑和功能
  • 瑞芯微 rk3568的npu使用,部署unet网络

    文章目录 rk3568 1 6 0 1 在任一个ubuntu系统上安装RKNN Toolkit2 1 1 下载 1 2 安装 2 在机器端 板端 查看 RKNPU2的驱动 3 RKNN使用说明
  • Linux Centos 配置 Docker 国内镜像加速

    在使用 Docker 进行容器化部署时 由于国外的 Docker 镜像源速度较慢 我们可以配置 Docker 使用国内的镜像加速器 以提高下载和部署的效率 本文将介绍如何在 CentOS 系统上配置 Docker 使用国内镜像加速 步骤一
  • 南大通用的时间类型的使用解析

    示例sql create table TCK DATE TEXT id INTEGER not null date date DEFAULT TODAY
  • three.js关键帧动画KeyframeTrack、AnimationClip、AnimationMixer

    参考资料 threejs中文网 threejs qq交流群 814702116 关键帧动画 打开课件案例源码 你可以看到物体从一个位置移动到另一个位置的动画效果 移动过程中也出现过颜色变化 课件源码效果具体描述 就是 0 3秒 物体逐渐从坐
  • Android驱动并发与竞争

    下面介绍 原子操作 atomic t 自旋锁 spinlock t 信号量 semaphore 互斥体 mutex Android Linux是一个多任务操作系统 肯定会存在多个任务共同操作同一段内存或者设备的情况 多个任务甚至中断都能访问
  • IPQ4019 IPQ4029 IPQ5018 IPQ8072 IPQ6010 Wallys OpenWRT Compatible Routerboard Wallys|Industrial

    IPQ4019 IPQ4029 IPQ5018 IPQ8072 IPQ6010 Wallys OpenWRT Compatible Routerboard Wallys Industrial Commercial use Wallys Un
  • 机器学习之迁移学习(Transfer Learning)

    概念 迁移学习 Transfer Learning 是一种机器学习方法 其核心思想是将从一个任务中学到的知识应用到另一个相关任务中 传统的机器学习模型通常是从头开始训练 使用特定于任务的数据集 而迁移学习则通过利用已经在一个任务上学到的知识
  • 多线程案例:银行取钱

    不安全取钱 两个人去银行取钱 账户 银行取钱 给账户上锁 public class UnsafeBank public static void main String args 账户 Account3 account new Account
  • threejs关键帧动画播放(拖动任意时间状态)

    参考资料 threejs中文网 threejs qq交流群 814702116 动画播放 拖动任意时间状态 如果你想了解 关键帧动画在特定时间段播放 或者把动画定位在时间轴上任何一个时刻 或者借助UI拖动条 拖动查看关键帧任何时刻的状态 可
  • 【HarmonyOS】HarmonyOS参考资料

    HarmonyOS HarmonyOS参考资料 HarmonyOS参考资料 一 HarmonyOS应用开发者高级认证 二 HarmonyOS应用开发者基础认证考试 HarmonyOS参考资料 一 HarmonyOS应用开发者高级认证 Har
  • 在matlab和opencv中分别实现稀疏表示

    在本文中 稀疏表示的原理不再具体讲解 有需要的同学请自行百度 本文采用OMP算法来求解稀疏系数 首先随机生成字典数据和待测试数据 字典数据 dic 6 7 9 9 7 0 6 3 6 9 1 8 7 8 5 3 8 1 7 3 3 3 5