opencv实现正交匹配追踪算法OMP

//dic: 字典矩阵;
//signal :待重构信号(一次只能重构一个信号,即一个向量)
//min_residual: 最小残差
//sparsity:稀疏度
//coe:重构系数
//atom_index:字典原子选择序号
//返回最后的残差
float OMP(    Mat& dic,Mat& signal,float min_residual,int sparsity,Mat& coe,vector<int>& atom_index)

{
    if(signal.cols>1)
    {
        cout<<"wrong signal"<<endl;
        return -1;
    }
    signal=signal/norm(signal);  //信号单位化
    Mat temp(1,dic.cols,5);
    for(int i=0;i<dic.cols;i++)
    {
        temp.col(i)=norm(dic.col(i));  //每个原子的模长
    }
    divide(dic,repeat(temp,dic.rows,1),dic); //字典原子单位化
    Mat residual = signal.clone();  //初始化残差
    coe.create(0, 1, CV_32FC1);  //初始化系数
    Mat phi;    //保存已选出的原子向量
    float max_coefficient;
    unsigned int atom_id;  //每次所选择的原子的序号

    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;
            atom_id = i;
            }
        }
        atom_index.push_back(atom_id); //添加选出的原子序号
        Mat& temp_atom= dic.col(atom_id); //取出该原子
        if (phi.cols == 0)
            phi = temp_atom;
        else
            hconcat(phi,temp_atom,phi); //将新原子合并到原子集合中(都是列向量)

        coe.push_back(0.0f);    //对系数矩阵新加一项
        solve(phi, signal,coe, DECOMP_SVD);    //求解最小二乘问题

        residual = signal - phi*coe;  //更新残差
        float res_norm = (float)norm(residual);

        if (coe.rows >= sparsity || res_norm <= min_residual) //如果残差小于阈值或达到要求的稀疏度,就返回
        {
            return res_norm;
        }
    }
}
时间: 2024-08-28 12:24:28

opencv实现正交匹配追踪算法OMP的相关文章

浅谈压缩感知(二十八):压缩感知重构算法之广义正交匹配追踪(gOMP)

主要内容: gOMP的算法流程 gOMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.gOMP的算法流程 广义正交匹配追踪(Generalized OMP, gOMP)算法可以看作为OMP算法的一种推广.OMP每次只选择与残差相关最大的一个,而gOMP则是简单地选择最大的S个.之所以这里表述为"简单地选择"是相比于ROMP之类算法的,不进行任何其它处理,只是选择最大的S个而已. gOMP的算法流程: 二.gOMP的MATLAB实现(CS_gOMP

浅谈压缩感知(二十六):压缩感知重构算法之分段弱正交匹配追踪(SWOMP)

主要内容: SWOMP的算法流程 SWOMP的MATLAB实现 一维信号的实验与结果 门限参数a.测量数M与重构成功概率关系的实验与结果 SWOMP与StOMP性能比较 一.SWOMP的算法流程 分段弱正交匹配追踪(Stagewise Weak OMP)可以说是StOMP的一种修改算法,它们的唯一不同是选择原子时的门限设置,这可以降低对测量矩阵的要求.我们称这里的原子选择方式为"弱选择"(Weak Selection),StOMP的门限设置由残差决定,这对测量矩阵(原子选择)提出了要求

[转]压缩感知重构算法之分段正交匹配追踪(StOMP)

分段正交匹配追踪(StagewiseOMP)或者翻译为逐步正交匹配追踪,它是OMP另一种改进算法,每次迭代可以选择多个原子.此算法的输入参数中没有信号稀疏度K,因此相比于ROMP及CoSaMP有独到的优势. 1.StOMP重构算法流程: 分段正交匹配追踪(StagewiseOMP)或者翻译为逐步正交匹配追踪,它是OMP另一种改进算法,每次迭代可以选择多个原子.此算法的输入参数中没有信号稀疏度K,因此相比于ROMP及CoSaMP有独到的优势. 1.StOMP重构算法流程: 2.分段正交匹配追踪(S

视频编码技术---压缩感知编码---匹配跟踪算法

转自https://blog.csdn.net/rainbow0210/article/details/53386695 压缩感知近些年在学术界非常火热,在信号处理领域取得了很多非常不错的成果. 博主最近的项目涉及到K-SVD算法,所以也就顺带着学习其重要的组成部分--匹配跟踪算法. 本文只介绍最基本的匹配跟踪算法和正交匹配跟踪算法,即MP和OMP. 这个算法的优化和变形非常之多,近些年学术界很多人都在研究这个,有兴趣的读者可以自行查阅相关论文,本文不多做阐述. 废话少说,直接上干货. 所谓压缩

浅谈压缩感知(二十七):压缩感知重构算法之稀疏度自适应匹配追踪(SAMP)

主要内容: SAMP的算法流程 SAMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.SAMP的算法流程 前面所述大部分OMP及其前改算法都需要已知信号的稀疏度K,而在实际中这个一般是不知道的,基于此背景,稀疏度自适应匹配追踪(Sparsity Adaptive MP)被提出.SAMP不需要知道稀疏度K,在迭代循环中,根据新残差与旧残差的比较来确定选择原子的个数. SAMP的算法流程: 二.SAMP的MATLAB实现(CS_SAMP.m) ? 三.一维信号

OpenCV &mdash;&mdash; 直方图与匹配

直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中.bin中的数值是从数据中计算出来的特征的统计量,这些数据可以是诸如梯度,方向,色彩或任何其他特征. 直方图获得是是数据分布的统计图 直方图的基本数据结构 CvHistogram 创建一个新的直方图 cvCreateHist dims   直方图维数的数目 sizes  直方图维数尺寸的数组 type  直方图的表示格式: CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND; CV_HIST_TREE

全局匹配KMP算法

KMP算法是通过分析模式字符串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,整理出来一个next数组,然后在上面的算法中使用. 本全局匹配KMP算法针对串的堆式存储数据结构 # define MAXSIZE 45 //固定next数组的长度 # define OK 1 # define ERROR 0 typedef int Status; //返回状态 //存放匹配字符串的位置 int indexArray[MAXSIZE] = {0}; //记录匹配字符串出现的次数 in

USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the first week, Farmer John r

HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very