图像稀疏编码总结:LLC和SCSPM,文章对稀疏编码讲解非常详细。

《Locality-constrained Linear Coding for Image Classification》的作者提供Matlab的代码实现,见http://www.ifp.illinois.edu/~jyang29/LLC.htm

下面是根据作者的代码,基于OpenCV,实现的C++版的LLC:

Matlab Code:www.ifp.illinois.edu/~jyang29/LLC.htm

<span style="font-size:12px;">    cv::Mat BowModel::findKNN(cv::Mat &codebook, cv::Mat &input, int k) {
int nbase = codebook.rows;
int nquery = input.rows;
Mat ii = input.mul(input);
Mat cc = codebook.mul(codebook); Mat sii(nquery,1,CV_32FC1);
sii.setTo(0);
Mat scc(nbase,1,CV_32FC1);
scc.setTo(0);
for (int i = 0; i<ii.rows; i++) {
for (int j = 0; j<ii.cols; j++) {
sii.at<float>(i,0) += ii.at<float>(i,j);
}
}
for (int i = 0; i<cc.rows; i++) {
for (int j = 0; j<cc.cols; j++) {
scc.at<float>(i,0) += cc.at<float>(i,j);
}
} Mat D(nquery,nbase,CV_32FC1);
for (int i = 0; i<nquery; i++) {
for (int j = 0; j<nbase; j++) {
D.at<float>(i,j) = sii.at<float>(i,0);
}
} Mat ct;
transpose(codebook, ct);
Mat D1 = 2*input*ct; Mat scct;
transpose(scc, scct);
Mat D2(nquery, nbase, CV_32FC1);
for (int i = 0; i<nquery; i++) {
for (int j = 0; j<nbase; j++) {
D2.at<float>(i,j) = scct.at<float>(0,j);
}
} D = D - D1 + D2;
Mat SD;
sortIdx(D, SD, CV_SORT_EVERY_ROW+CV_SORT_ASCENDING);
Mat IDX(nquery,k,CV_8UC1);
for (int i = 0; i<nquery; i++) {
for (int j = 0; j<k; j++) {
IDX.at<uchar>(i,j) = SD.row(i).col(j).at<uchar>(0,0);
}
} ii.release();
cc.release();
sii.release();
scc.release();
D.release();
ct.release();
D1.release();
scct.release();
D2.release();
SD.release();
return IDX;
} cv::Mat BowModel::llccode(cv::Mat &codebook, cv::Mat &input, cv::Mat IDX, int k)
{
int nquery = input.rows;
int nbase = codebook.rows;
int dim = codebook.cols; Mat II = Mat::eye(k, k, CV_32FC1);
Mat Coeff(nquery,nbase,CV_32FC1);
Coeff.setTo(0);
Mat z;
Mat z1(k,dim,CV_32FC1);
Mat z2(k,dim,CV_32FC1);
Mat C;
Mat un(k,1,CV_32FC1);
un.setTo(1);
Mat temp;
Mat temp2;
Mat w;
Mat wt; for (int n = 0; n<nquery; n++) {
for (int i = 0; i<k; i++) {
for (int j = 0; j<dim; j++) {
z1.at<float>(i,j) = codebook.at<float>(IDX.at<uchar>(n,i),j);
z2.at<float>(i,j) = input.at<float>(n,j);
}
}
z = z1 - z2;
transpose(z, temp);
C = z*temp;
C = C + II*(1e-4)*trace(C)[0];
invert(C,temp2);
w = temp2*un;
float sum_w=0;
for (int i = 0; i<k; i++) {
sum_w += w.at<float>(i,0);
}
w = w/sum_w;
transpose(w, wt);
for (int i = 0; i<k; i++) {
Coeff.at<float>(n,IDX.at<uchar>(n,i)) = wt.at<float>(0,i);
}
} II.release();
z.release();
z1.release();
z2.release();
C.release();
un.release();
temp.release();
temp2.release();
w.release();
wt.release(); return Coeff;
} </span>

C++版的LLC代码的更多相关文章

  1. 《疯狂Java讲义第4版》PDF+代码+课件 电子书pdf 分享

    <疯狂Java讲义(第4版)>是<疯狂Java讲义>的第4版,第4版保持了前3版系统.全面.讲解浅显.细致的特性,全面新增介绍了Java 9的新特性. <疯狂Java讲义 ...

  2. java版第一个代码——HelloWorld!

    java版第一个代码--HelloWorld! 今天来接触一下java代码: 事前准备 jdk的配置(推荐jdk8或jdk11) notepad++或idea软件 开始编写 建立文件夹存放代码 建立j ...

  3. WPS Office手机版调用接口代码指导帖之一(Android)

    经常会有一些喜欢开发鼓捣的童鞋问我们,WPS Office手机版是否提供调用接口,希望在android中使用一个调用命令,直接调用WPS手机版来打开指定的DOC文件,而不用弹出一个程序可选列表(如果用 ...

  4. Js 网页版扫雷游戏代码实现

    这个游戏是自己在大约一年前联系js熟练度时做的,用的都是基础的东西,最近比较忙没时间整理.直接发给大家,有兴趣的可以看一下.欢迎大家提出建议.如果你有什么新的想法也可以提出来,或者你并不擅长编程.你想 ...

  5. Android版微信小代码(转)

    以下代码仅适用于Android版微信: //switchtabpos:让微信tab更贴合Android Design 如果你并不喜欢微信Android版和iOS端同用一套UI,现在有一个小方法可以实现 ...

  6. 非递归遍历二叉树Java版的实现代码(没写层次遍历)

    直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...

  7. Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题

    学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...

  8. VS2015中跑OpenGL红宝书第八版的示例代码

    OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资料终于跑起来了,记录一下 一.环境 ...

  9. 一分钟搭建 Web 版的 PHP 代码调试利器

    一.背景   俗话说:"工欲善其事,必先利其器".作为一门程序员,我们在工作中,经常需要调试某一片段的代码,但是又不想打开繁重的 IDE (代码编辑器).使用在线工具调试代码有时有 ...

随机推荐

  1. 洛谷 2387 NOI2014魔法森林 LCT

    [题解] 我们先把边按照$a$值从小到大排序,并按照这个顺序加边. 如果当前要加入的边连接的两点$u$与$v$已经是连通的,那么直接加入这条边就会出现环.这时我们需要删除这个环中$b$值最大的边.因此 ...

  2. 洛谷 3391 【模板】文艺平衡树 Treap区间翻转

    [题解] 用Treap维护这个序列. 加入的时候直接插入到末尾,这样Treap就变成一棵以插入时间先后为排序关键字的二叉搜索树. 对于翻转操作,我们分裂出需要翻转的区间,给这个区间的root打一个翻转 ...

  3. LeetCode 712. Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  4. Redis学习总结(2)——Java使用Redis

    安装 开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. Java的安装配置可以参考我们的 Java ...

  5. Python 5 运算符

    数学运算符: + 加                 1 + 1 = 2 -   减 2 - 1 = 1 ×  乘 2 × 2 = 4 /   除 3 / 2 = 1.5 不同版本可能显示小数位数不同 ...

  6. [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树

    Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...

  7. Oracle数据库点滴

    分页查询: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)W ...

  8. POJ 2960

    也算是一道模板题吧,只需按照SG函数的定义求出每个值的SG,然后异或就可以了. #include <iostream> #include <cstdio> #include & ...

  9. @PropertySource&@ImportResource&@Bean

    @**PropertySource**:加载指定的配置文件: ```java /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉 ...

  10. Oracle数据库版本号定期检视与升级的必要性分析

    目 录 ▇1.ORACLE数据库版本号知识 ▇2.看看自己的数据库还有没有支持服务 ▇3.看11.2.0.3版本号各PSU的公布时间与解决BUG数量列表 ▇4.看11.2.0.4版本号各PSU的公布时 ...