使用积分图像统计元素
若需要多个感兴趣图像统计直方图,十分耗时;但积分图像明显提高速率;
函数Scalar sum(InputArray src);
遍历区域所有像素,返回和;
为了理解积分图像的实现原理,我们先对它下一个定义。取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,用这种方式得到的图像称为积分图像。计算积分图像时只需对图像扫描一次。这是因为当前像素的积分值等于上一像素的积分值加上当前行的累计值。因此积分图像就是一个包含像素累加和的新图像。为了防止溢出,积分图像的值通常采用int类型或float类型。例如下图中,积分图像的像素L1包含左上角区域。
计算完积分图像后,只需要访问四个像素就可以得到任何矩形区域的像素累加和。这里解释一下原因。再来看看前面的图片,计算由L1、L2、L3、L4四个像素表示区域的像素累计和,先读取L4的积分值,然后减去L2的像素值和L3左手边区域的像素值。但是这样就把L1左上角的像素累加和减去两次,因此需要重新加上L1的积分值。所以计算L1、L2、L3、L4区域内的像素累加的正式公式为:L4-L2-L3+L1。
void integral( InputArray src, OutputArray sum, int sdepth=-1 );(计算积分图像的参数)
第一个参数src,可以使灰度图或RGB彩色图,单通道和三通道均可作为输入,但每个通道的精度必须是8位int或32位、64位浮点型;
第二个参数sum,积分图,若输入src是灰度图,则积分图也是灰度图,若输入src是RGB三通道图,则积分图sum也是RGB三通道彩色。sum的图像深度是32位整型或32位、64位浮点型,这取决于第三个参数sdepth的定义;
第三个参数sdepth,定义积分图的深度(depth),32位整型或者32位、64位浮点型。注意图像的深度跟图像的通道数是无关的,相关概念可以参看这里:Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解 ;