积分图:将图像中任意一点的像素值变成其左上角所有像素值的总和(包含其自身像素值),得出的图像就叫积分图。通过积分图像,可以加快计算速度。
举例:
求图像中任意大小区域的积分图像:
ii 表示 integral image
void integral( // 积分图计算
InputArray src, // 输入图像,灰度图
OutputArray sum, // 求和,输出的尺寸比原图行列都要加1 , 不想行列变化的,自己实现积分图算法
OutputArray sqsum, // 求和的平方,输出的尺寸比原图行列都要加1
OutputArray tilted, // 旋转45°的积分图
int sdepth = -1,
int sqdepth = -1
);
代码
#include "../common/common.hpp"
void main(int argc, char** argv)
{
Mat src = imread(getCVImagesPath ("images/test1_3.png"), IMREAD_GRAYSCALE);
imshow("src-18", src);
Mat sumii = Mat::zeros(src.rows + 1, src.cols + 1, CV_32FC1);
Mat sqsumii = Mat::zeros(src.rows + 1, src.cols + 1, CV_64FC1);
integral(src, sumii, sqsumii); // 积分图计算
Mat iiResult;
normalize(sumii, iiResult, 0, 255, NORM_MINMAX, CV_8UC1, Mat()); // 归一化显示
imshow("sumii", iiResult);
Mat sqiiResult;
normalize(sqsumii, sqiiResult, 0, 255, NORM_MINMAX, CV_8UC1, Mat());
imshow("sqsumii", sqiiResult);
waitKey(0);
}