目录
1 概念讲解及用处
积分图像(Integral Image),也被称为积分图或和图,是一种用于快速计算图像矩形区域和特征值的数据结构。它通过对原始图像进行累加运算而得到,在计算机视觉和图像处理中起着重要作用。
在积分图像中,每个像素点的值表示了其左上角矩形区域内所有像素值的累加和。换句话说,积分图像的每个像素点都包含了原始图像中相应位置及其左上方区域内所有像素值的累加和。
积分图像具有以下几个特性:
快速计算矩形区域和:通过使用积分图像,可以在常数时间内计算任意大小的矩形区域内像素值的累加和。这是因为只需要执行四次加法和一次减法操作即可完成计算,而不需要遍历矩形区域内的每个像素。
累加和的重复利用:积分图像允许多个矩形区域共享相同的累加和计算结果。这在某些计算密集型任务中非常有用,例如目标检测、人脸识别等,可以大大减少计算量。
线性空间开销:积分图像的大小比原始图像大小加1,即原始图像为N*N,积分图像为(N+1)
*(N+1)因此它不会引入额外的空间开销。
积分图像的主要用途之一是快速计算任意大小矩形区域内像素值的累加和,可以大大加速相关算法的计算过程,如目标检测、人脸识别等。
2 函数详解
在OpenCV中,可以使用cv::integral()函数计算积分图像。该函数接受原始图像作为输入,并返回一个与原始图像尺寸相同的积分图像。v
oid cv::integral(const cv::InputArray src, cv::OutputArray sum, int sdepth = -1);
该函数接受以下参数:
src:输入数组,表示原始图像。可以是单通道灰度图像或多通道彩色图像。
sum:输出数组,表示计算得到的积分图像。它与原始图像具有相同的尺寸和数据类型。
sdepth:可选参数,指定输出积分图像的深度,默认值为-1,表示与输入图像的深度相同。
3 原理
假设原始图像为I(x, y),积分图像为S(x, y)。则积分图像的计算公式如下:
下面以3×3的图像为例,根据计算规则,积分图像的每个像素点都包含了原始图像中相应位置及其左上方区域内所有像素值的累加和。计算积分图像:
首先生成的积分图像为4×4,并填补0,并计算第一个积分图像
根据计算规则继续计算
中间的计算过程,与以上计算方法一致,最后计算出整个积分图像:
4 用C++编写代码进行实现
下面是一个使用OpenCV计算积分图像的简单示例代码
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像
cv::Mat integralImage;
cv::integral(image, integralImage, CV_32S); // 计算积分图像
// 打印积分图像的某个位置的累加和
std::cout << "Sum at (100, 100): " << integralImage.at<int>(100, 100) << std::endl;
return 0;
}