Matlab 快速多通道积分图计算函数
所谓快速多通道积分图计算,其实就是 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 快速多通道积分图计算函数的更多相关文章
- opencv::积分图计算
		利用积分图像,可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和.求均值以及标准方差的计算,并且保证运算的复杂度为O(). #include <opencv2/opencv.hpp> ... 
- OpenCV——积分图计算
		#include <opencv2/opencv.hpp> #include <iostream> #include "math.h" using name ... 
- 积分图(二) - Block - Match(统计)滤波器
		原文地址(英文) 积分图 是 [Crow(1984 年)] 提出的用于提高多尺度透视投影中纹理的渲染速度的一种技术. 积分图最流行的应用是 快速归一化互相关 (fast normalized cros ... 
- 使用axes函数在matlab绘图中实现图中图的绘制
		使用axes函数在matlab绘图中实现图中图的绘制 有时为了对细节进行详细说明,需要在一个较大坐标轴上绘制一个小图来对局部进行放大以阐述结果. 这可以通过调用axes函数实现. 下面通过绘制 y=1 ... 
- 快速部署 Spring PetClinic 到函数计算平台
		简介 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ... 
- matlab快速入门
		matlab快速入门 1矩阵 生成矩阵  % 直接法 a = [1,2,3;4,5,6;7,8,9]; % 冒号一维矩阵 a = 开始:步长:结束,步长为1可省略 b = 1:1:10; % 1,2 ... 
- 浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联
		浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸 ... 
- Spark入门实战系列--9.Spark图计算GraphX介绍及实例
		[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ... 
- 明风:分布式图计算的平台Spark GraphX  在淘宝的实践
		快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ... 
随机推荐
- spark streaming 1: SparkContex
			StreamingContext 和SparkContex的用途是差不多的,作为spark stream的入口,提供配置.生成DStream等功能. 总体来看,spark stream包括如下模块: ... 
- maven仓库,snapshot快照仓库和release发布仓库的区别
			首先看下snapshot类型 建立一个maven-privider项目,版本定义为1.1-SNAPSHOT 创建一个privider类,写一个hello()方法,并推送maven私有仓库 然后再建立一 ... 
- Linux搭建Samba共享服务器
			实验要求: Samba文件共享服务配置与访问,配置访问用户以及相应权限. Tips:创建共享目录/test和/share,并且分别在/test下创建文件tf1(只读)tf2(读写) 在/share ... 
- CAN波特率设置
			通过对CAN位定时寄存器CANBIT以及CAN波特率预分频扩展寄存器CANBRPE的设置可以得到需要的CAN通信波特率. CAN的位定时配置不当,将使得CAN模块无法按照目标波特率接入CAN网络,将导 ... 
- leetcode 103二叉树的锯齿形层次遍历
			与102相比就增加了flag,用以确定要不要进行reverse操作 reverse:STL公共函数,对于一个有序容器的元素reverse ( s.begin(),s.end() )可以使得容器s的元素 ... 
- python - 函数any() 和 all() 的区别
			转自:https://www.cnblogs.com/nulige/p/6128816.html any()与all()函数的区别: any是任意,而all是全部. 版本:该函数适用于2.5以上版本, ... 
- ControlTemplate in WPF —— ComboBox
			<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ... 
- 四十四:数据库之SQLAlchemy之join实现复杂查询
			准备工作 from datetime import datetime from sqlalchemy import create_engine, Column, Integer, String, Da ... 
- Oracle 笔记(四)
			PLSQL编程[语法.plsql控制语句.异常.游标.触发器.存储过程] 1. PLSQL的语法–块编程 a) 概念:procedural language s ... 
- 解密Go语言之 pprof
			相信很多人都听过“雷神 3”关于性能优化的故事.在一个 3D 游戏引擎的源码里,John Carmack 将 1/sqrt(x) 这个函数的执行效率优化到了极致. 一般我们使用二分法,或者牛顿迭代法计 ... 
