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

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

代码

  1. #include <string.h>
  2. #include <mex.h>
  3. #include <stdio.h>
  4. #include <stdint.h>
  5. // compute integral image
  6. template <typename T>
  7. void integral(const T* in, T* out, mwSize h, mwSize w, mwSize ch)
  8. {
  9. mwSize iw = w + 1;
  10. mwSize ih = h + 1;
  11. out += 1;
  12. memset(out, 0, ih * iw * ch * sizeof(T));
  13. for (mwSize c = 0; c < ch; ++c)
  14. {
  15. // offset one row and one column
  16. out += ih;
  17. // from first to last column
  18. for (mwSize x = 0; x < w; ++x, in += h, out += ih)
  19. {
  20. T s = 0.0f;
  21. // from first to last column
  22. for (mwSize y = 0; y < h; ++y)
  23. {
  24. s += in[y];
  25. out[y] = out[y - ih] + s;
  26. }
  27. }
  28. }
  29. }
  30. // itg = integralChannels(channels)
  31. void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
  32. {
  33. mxClassID classId = mxGetClassID(prhs[0]);
  34. mwSize nDims = mxGetNumberOfDimensions(prhs[0]);
  35. const mwSize *dims = mxGetDimensions(prhs[0]);
  36. mwSize *iDims = new mwSize[nDims];
  37. if (nDims != 3 && nDims != 2)
  38. {
  39. mexErrMsgTxt("integralChannels() can only integrate single or multichannel image.");
  40. }
  41. mwSize h = dims[0];
  42. mwSize w = dims[1];
  43. mwSize ch = 1;
  44. iDims[0] = h + 1;
  45. iDims[1] = w + 1;
  46. if (nDims == 3)
  47. {
  48. ch = dims[2];
  49. iDims[2] = ch;
  50. }
  51. plhs[0] = mxCreateNumericArray(nDims, iDims, classId, mxREAL);
  52. delete [] iDims;
  53. switch (classId)
  54. {
  55. case mxSINGLE_CLASS:
  56. integral<float>((float *)mxGetData(prhs[0]),
  57. (float *)mxGetData(plhs[0]), h, w, ch);
  58. break;
  59. case mxDOUBLE_CLASS:
  60. integral<double>((double *)mxGetData(prhs[0]),
  61. (double *)mxGetData(plhs[0]), h, w, ch);
  62. break;
  63. case mxUINT32_CLASS:
  64. integral<uint32_t>((uint32_t *)mxGetData(prhs[0]),
  65. (uint32_t *)mxGetData(plhs[0]), h, w, ch);
  66. break;
  67. case mxINT32_CLASS:
  68. integral<int32_t>((int32_t *)mxGetData(prhs[0]),
  69. (int32_t *)mxGetData(plhs[0]), h, w, ch);
  70. break;
  71. default:
  72. mexErrMsgTxt("Illegal Class ID.");
  73. }
  74. return;
  75. }

性能测试

  1. # Elapsed time is 0.062636 seconds.
  2. tic; integralChannels(ones(1000, 1000, 9)); toc;
  3. # Elapsed time is 0.085479 seconds.
  4. tic; vl_imintegral(ones(1000, 1000, 9)); toc;
  5. # Elapsed time is 0.128849 seconds.
  6. 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. Note: Bigtable, A Distributed Storage System for Structured Data

    Abstract Introduction::  Bigtable设计主旨:可扩地扩展到pByte级别和数千台机器的系统, 通用.可伸缩.高性能.高可用性.  不实现完整的关系数据模型,而是支持一个可 ...

  2. 使用ffmpeg切片出hls

    测试的时候经常要用到ffmpeg切hls的流 ffmpeg -re -i g:/media/baifa.mp4 -codec copy -f hls -hls_list_size -hls_wrap ...

  3. P1070道路游戏题解

    日常吐槽 作为hin久hin久以前考试考到过的一道题窝一直咕咕咕到现在才想起来去做因为讲解都忘干净了然后自己重新考虑发现被卡了3天 题面 看到题目发现这题的dp状态似乎有点不是很明确? 我们来理一理题 ...

  4. CentOS mysql安装

    MySQL For Excel 1.3.5MySQL for Visual Studio 1.2.5MySQL Fabric 1.5.6 & MySQL Utilities 1.5.6Conn ...

  5. Sar监控

    sar 的命令格式为:sar [ -A ] [ -b ] [ -B ] [ -c ] [ -d ] [ -i interval ] [ -p ] [ -q ] [ -r ] [ -R ] [ -t ] ...

  6. SpringCloud解决了哪些问题?

    1.与分布式系统相关的复杂性 – 包括网络问题,延迟开销,带宽问题,安全问题. 2.处理服务发现的能力 – 服务发现允许集群中的进程和服务找到彼此并进行通信. 3.解决冗余问题 – 冗余问题经常发生在 ...

  7. junction 文件夹做连接到别的分区

    加载连接 C:\>junction "C:\Docume~1\Admini~1\LocalS~1\Applic~1\360Chr~1\Chrome\UserDa~1\Default&q ...

  8. c语言Ι博客作业04

    这个作业属于哪个课程 c语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9771 我在这个课程的目 ...

  9. poj2407(欧拉函数模板题)

    题目链接:https://vjudge.net/problem/POJ-2407 题意:给出n,求0..n-1中与n互质的数的个数. 思路:欧拉函数板子题,先根据唯一分解定理求出n的所有质因数p1,p ...

  10. 2014年北京 happy matt friends(dp + 滚动数组优化)

    Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others)    Memory Limit: 510000/510000 K (Java/Oth ...