OpenCV4入门系列教程67:图像积分图算法

入门系列索引:OpenCV入门系列教程索引目录

上一篇:OpenCV4入门系列教程66:最大熵阈值分割(待补充)

图像积分介绍:积分图像介绍

OpenCV提供的积分图像算法函数原型:

1
2
3
void integral(InputArray src, OutputArray sum, int sdepth=-1 )
void integral(InputArray src, OutputArray sum, OutputArray sqsum, int sdepth=-1 )
void integral(InputArray src, OutputArray sum, OutputArray sqsum, OutputArray tilted, int sdepth=-1 )
  • image:输入图像, W×H, 单通道,8位或浮点 (32f 或 64f).
  • sum:积分图像, W+1×H+1(译者注:原文的公式应该写成(W+1)×(H+1),避免误会), 单通道,32位整数或 double 精度的浮点数(64f).
  • sqsum:对象素值平方的积分图像,W+1×H+1(译者注:原文的公式应该写成(W+1)×(H+1),避免误会), 单通道,32位整数或 double 精度的浮点数 (64f).
  • tilted_sum:旋转45度的积分图像,单通道,32位整数或 double 精度的浮点数 (64f).

利用积分图像,可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和、求均值以及标准方差的计算,并且保证运算的复杂度为O(1)。例如:

因此可以在变化的窗口内做快速平滑或窗口相关等操作。

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main() {
uchar a[ 5 ][ 5 ] = {
{17, 24, 1, 8, 15}, {23, 5, 7, 14, 16}, {4, 6, 13, 20, 22},
{10, 12, 19, 21, 3}, {11, 18, 25, 2, 9},
};
Mat src(5, 5, CV_8UC1, &a);
cout << src << endl;
Mat dst;
integral(src, dst, -1);
cout << dst(Range(1, dst.rows), Range(1, dst.cols)) << endl;

return 0;
}

测试结果:

1
2
3
4
5
6
7
8
9
10
[ 17,  24,   1,   8,  15;
23, 5, 7, 14, 16;
4, 6, 13, 20, 22;
10, 12, 19, 21, 3;
11, 18, 25, 2, 9]
[17, 41, 42, 50, 65;
40, 69, 77, 99, 130;
44, 79, 100, 142, 195;
54, 101, 141, 204, 260;
65, 130, 195, 260, 325]

下一篇:OpenCV4入门系列教程68:图像均值漂移分割(meanshift)