使用积分图像有效地对矩阵行中的元素求和

Posted

技术标签:

【中文标题】使用积分图像有效地对矩阵行中的元素求和【英文标题】:Efficiently summing elements in a row of a matrix using Integral Image 【发布时间】:2015-07-14 12:54:22 【问题描述】:

我想在当前位置的 +30 -30 区间内对矩阵的每个元素求和。更准确地说,假设我有一个元素 a[i][j] 并且我喜欢对所有元素求和 a[i][j - 30] + a[i][j - 29] + a[i][j - 28] + ..... + a[i][ j + 28] + a[i] [j+29] + a[i][j + 30; 我还计算了矩阵的积分图像,这样我就可以通过公式 A + D - C - D 轻松有效地求和; 在这里你可以看到一篇文章它是如何工作的 http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#integral 我的问题是如何使用已经计算的积分图像有效地求和。还是有其他有效的方法?

感谢您的宝贵时间!

附:我知道我可以计算前 30 个元素的总和,并且在每个步骤中添加和减去 1 个元素 - 从前面添加一个元素并从底部减去一个元素。但我想知道我是否可以做得更快

【问题讨论】:

那么,您已经知道如何从积分图像中计算出a[i][j-30] + ... + a[i][j+30] 的总和了吗?如果是这样,那有什么问题?如果您在谈论效率,您还应该发布带​​有完整图像和其他实现的实现的执行时间,以及图像的大小。还有代码! 积分图像计算是从open cv所以cv::integral(image, outputImage);这个想法是如何从一条线的积分图像中计算总和。我知道如何使用积分图像计算平方和,但我该如何计算一条线? 是的..所以你的问题是如何计算给定积分图像的总和? 因为 a == b 和 c ==d - 如果 abcd 是我们的矩形?而且我实际上不想通过减去各种矩形来计算总和。如果有办法从减法中找到它,但如果我们能找到类似于 a+d-b-c 的公式? 【参考方案1】:

通过使用积分图像,您可以获得给定矩形中值的总和,例如(来自***):

您只需为 A、B、C、D 设置正确的值。

Mat1f I; // your integral image

// for each i,j (check boundaries!)
int radius = 30;
float A = I[i-1][j-radius-1];
float B = I[i-1][j+radius];
float C = I[i][j-radius-1];
float D = I[i][j + radius];

float sum = D - B - C + A;

【讨论】:

我明白这一点,但如果 a == c 和 b == d 怎么办?这是问题吗? @MMp131316 你想要一行,对吧?所以a和b是一排! (并且 a 和 c 在左列) @MMp131316 很高兴它有帮助!

以上是关于使用积分图像有效地对矩阵行中的元素求和的主要内容,如果未能解决你的问题,请参考以下文章

Matlab数值积分

LLVM IR:有效地对向量求和

机器视觉中的图像积分图及事实上现

OpenCV中积分图介绍与应用

R:建立积分矩阵的最快方法?

图像处理之积分图应用四(基于局部均值的图像二值化算法)