计算源图像一个或多个积分图像,如下所示:
sum(X,Y)=∑x<X,y<Yimage(x,y)
sqsum(X,Y)=∑x<X,y<Yimage(x,y)2
tilted(X,Y)=∑y<Y,abs(x−X+1)≤Y−y−1image(x,y)
使用这些积分图像,可以在一个固定的时间内在图像的特定右上方或旋转矩形区域上求和计算平均值和标准偏差,例如:
∑x1≤x<x2,y1≤y<y2image(x,y)=sum(x2,y2)+sum(x1,y1)−sum(x1,y2)−sum(x2,y1)
在多通道图像的情况下,每个通道的总和独立累加。
OpenCV中利用函数integral()计算图像的积分。
函数integral()参数说明:
void integral(
InputArray src, //输入图像(8位整型或32或64浮点图)
OutputArray sum,//积分图像(32位整型或32或64浮点图)
OutputArray sqsum,//积分图像像素值的平方
OutputArray tilted,//图像旋转45度的积分
int sdepth = -1, //积分和倾斜积分图像的期望深度(CV_32S、CV_32F、
CV_64F)
int sqdepth = -1 //平方像素值积分图像的期望深度(CV_32F、CV_64F)
);
其中:
输入图像src 为
W×H
,积分图像sum为
(W+1)×(H+1)
, 积分图像像素值的平方sqsum为大小
(W+1)×(H+1)
的双精度
浮点(64f)数组;图像旋转45度的积分tilted为
(W+1)×(H+1)
大小的数组,数据类型与sum相同。
integral()示例:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/image/daibola.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
Mat sumii = Mat::zeros(src.size(), CV_32FC1);
Mat sqsumii = Mat::zeros(src.size(), CV_64FC1);
//计算图像的积分
integral(src, sumii, sqsumii);
//规范化
normalize(sumii, dst, 0, 255, NORM_MINMAX, CV_8UC1, Mat());
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey(0);
return 0;
}