所谓快速多通道积分图计算,其实就是 cumsum2D。

我写了一个比较快的版本(比 VLFeat 的快),用 mex 编译一下就能用了。

代码

#include <string.h>
#include <mex.h>
#include <stdio.h>
#include <stdint.h> // compute integral image
template <typename T>
void integral(const T* in, T* out, mwSize h, mwSize w, mwSize ch)
{
mwSize iw = w + 1;
mwSize ih = h + 1;
out += 1;
memset(out, 0, ih * iw * ch * sizeof(T));
for (mwSize c = 0; c < ch; ++c)
{
// offset one row and one column
out += ih;
// from first to last column
for (mwSize x = 0; x < w; ++x, in += h, out += ih)
{
T s = 0.0f;
// from first to last column
for (mwSize y = 0; y < h; ++y)
{
s += in[y];
out[y] = out[y - ih] + s;
}
}
}
} // itg = integralChannels(channels)
void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
mxClassID classId = mxGetClassID(prhs[0]);
mwSize nDims = mxGetNumberOfDimensions(prhs[0]);
const mwSize *dims = mxGetDimensions(prhs[0]);
mwSize *iDims = new mwSize[nDims]; if (nDims != 3 && nDims != 2)
{
mexErrMsgTxt("integralChannels() can only integrate single or multichannel image.");
}
mwSize h = dims[0];
mwSize w = dims[1];
mwSize ch = 1; iDims[0] = h + 1;
iDims[1] = w + 1;
if (nDims == 3)
{
ch = dims[2];
iDims[2] = ch;
}
plhs[0] = mxCreateNumericArray(nDims, iDims, classId, mxREAL);
delete [] iDims;
switch (classId)
{
case mxSINGLE_CLASS:
integral<float>((float *)mxGetData(prhs[0]),
(float *)mxGetData(plhs[0]), h, w, ch);
break;
case mxDOUBLE_CLASS:
integral<double>((double *)mxGetData(prhs[0]),
(double *)mxGetData(plhs[0]), h, w, ch);
break;
case mxUINT32_CLASS:
integral<uint32_t>((uint32_t *)mxGetData(prhs[0]),
(uint32_t *)mxGetData(plhs[0]), h, w, ch);
break;
case mxINT32_CLASS:
integral<int32_t>((int32_t *)mxGetData(prhs[0]),
(int32_t *)mxGetData(plhs[0]), h, w, ch);
break;
default:
mexErrMsgTxt("Illegal Class ID.");
}
return;
}

性能测试

# Elapsed time is 0.062636 seconds.
tic; integralChannels(ones(1000, 1000, 9)); toc;
# Elapsed time is 0.085479 seconds.
tic; vl_imintegral(ones(1000, 1000, 9)); toc;
# Elapsed time is 0.128849 seconds.
tic; cumsum2D(ones(1000, 1000, 9)); toc;

Matlab 快速多通道积分图计算函数的更多相关文章

  1. opencv::积分图计算

    利用积分图像,可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和.求均值以及标准方差的计算,并且保证运算的复杂度为O(). #include <opencv2/opencv.hpp> ...

  2. OpenCV——积分图计算

    #include <opencv2/opencv.hpp> #include <iostream> #include "math.h" using name ...

  3. 积分图(二) - Block - Match(统计)滤波器

    原文地址(英文) 积分图 是 [Crow(1984 年)] 提出的用于提高多尺度透视投影中纹理的渲染速度的一种技术. 积分图最流行的应用是 快速归一化互相关 (fast normalized cros ...

  4. 使用axes函数在matlab绘图中实现图中图的绘制

    使用axes函数在matlab绘图中实现图中图的绘制 有时为了对细节进行详细说明,需要在一个较大坐标轴上绘制一个小图来对局部进行放大以阐述结果. 这可以通过调用axes函数实现. 下面通过绘制 y=1 ...

  5. 快速部署 Spring PetClinic 到函数计算平台

    简介 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  6. matlab快速入门

    matlab快速入门 1矩阵 生成矩阵 ​ % 直接法 a = [1,2,3;4,5,6;7,8,9]; % 冒号一维矩阵 a = 开始:步长:结束,步长为1可省略 b = 1:1:10; % 1,2 ...

  7. 浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联

    浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸 ...

  8. Spark入门实战系列--9.Spark图计算GraphX介绍及实例

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ...

  9. 明风:分布式图计算的平台Spark GraphX 在淘宝的实践

    快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...

随机推荐

  1. sql server中 设置与查看锁的超时时间(ZT) @@LOCK_TIMEOUT

      在数据库的应用系统中,死锁是不可避免的.通过设置死锁的处理优先级方法,可以在数据库引擎中自动检测到死锁,对发生的死锁会话进行干预,从而达到解除死锁的目点,但在这种情况下,会话只能被动的等待数据库引 ...

  2. 一起学vue指令之v-html

    一起学vue指令之v-html 一起学 vue指令 v-html  指令可看作标签属性 某些情况下,我们点击百度搜索下一页,服务器应该就返回下一页的数据页面,包含其他资源链接等. 返回的数据的本质是一 ...

  3. 介绍一下 NDK?

    1.NDK 是一系列工具的集合 NDK 提供了一系列的工具,帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用一起打包成 apk.NDK 集成了交叉编译器,并提供了相应 ...

  4. nohup及pip命令总结

    最近在搭建Python的Web开发环境的时候,用到nohup和pip等一些工具,先简单总结一下,以备后续查用. 1.nohup nohup(no hang up)就是不挂断的意思,如果你正在运行一个进 ...

  5. playbook部署mangodb

    playbook文件 [root@localhost ~]# cat deploy_mongo.yaml --- - hosts: webservers become: yes become_meth ...

  6. 深入理解Istio核心组件之Pilot

    Istio作为当前服务网格(Service Mesh)领域的事实标准,流量治理(Traffic Management)是其最为基础也最为重要的功能.本文将结合源码对Istio流量治理的实现主体——组件 ...

  7. HashMap根据value值排序

    )))); Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); for (Map.Entry s : entr ...

  8. cocos2dx[3.2](3) 浅析CCDeprecated.h

    CCDeprecated.h中存放的都是2.x将要被抛弃的命名规范,主要包含类名.枚举类型. 虽然说2.x的这些命名规范被CCDeprecated.h保留了.但是为了彻底学习3.x的新特性,就必须要尽 ...

  9. python学习之不要在列表迭代的时候进行增删操作

    注意:列表不能在for循环时使用remove方法 li = [11,22,33,44] for i in li : li.remove(i) print (li) #输出 [22, 44] ​ for ...

  10. 【miscellaneous】监狱安防系统智能视频监控系统设计方案

    1监狱安防新需求 随着司法监狱管理系统内视频监控系统的日益发展,现有的被动式人工监控这一传统模式已无法满足新形势下的监管工作需求,尤其是现在靠轮询的视频监控方式,无法对突发恶性事件做到第一时间的防御和 ...