图像积分图的计算方法
Author:Maddock
Date:2015-01-15 15:14:55
图像的积分图计算是一种重要的基础操作,可以应用于快速Haar特征计算以及图像的均值滤波算法中。
src = magic(5) [m n d] = size(src); integralimg = zeros(m ,n); integralimg(1,1) = src(1,1); for i = 2 : n integralimg(1,i) = integralimg(1,i - 1) + src(1, i); end for i = 2 : m integralimg(i, 1) = integralimg(i - 1, 1) + src(i, 1); end for i = 2:m for j = 2 : n integralimg(i , j) = integralimg(i, j - 1) + integralimg(i - 1, j) - integralimg(i - 1, j - 1) + src(i , j); end end integralimg % 验证积分图像是否正确 test = src; for i=2:m for j=2:n test(i,j) = sum(sum(src(1:i, 1:j))); end end test
结果:
src =
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
integralimg =
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
test =
17 24 1 8 15
23 69 77 99 130
4 79 100 142 195
10 101 141 204 260
11 130 195 260 325
另外,OpenCv中提供了 Integral和cvIntegral函数来计算图像的积分图。
- C++: void integral(InputArray src, OutputArray sum, int sdepth=-1 )
- C++: void integral(InputArray src, OutputArray sum, OutputArray sqsum, int sdepth=-1 )
- C++: void integral(InputArray src, OutputArray sum, OutputArray sqsum, OutputArray tilted, int sdepth=-1 )
C: void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL );
- 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)。例如:
因此可以在变化的窗口内做快速平滑或窗口相关等操作。
c++ 代码如下:
void 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; }
结果:
参考:
http://blog.sina.com.cn/s/blog_659f58370100i1k2.html
http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm