adong7639

图像积分图的计算方法

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://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#void%20integral%28InputArray%20src,%20OutputArray%20sum,%20int%20sdepth%29

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

分类:

技术点:

相关文章: