opencv_C++ integral()函数 积分图计算
一、积分图原理
在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和,表示如下:
从给定图像I从上到下、从左到右计算得到和的积分图像公式如下:
其中(x<0 || y<0) 时ii(x,y)=0, i(x,y)=0
积分图像解释:
如有一块区域像素如下:
图一:
那么其积分图像为左上角像素之和,那么就是:
图二:
得到积分图像之后,图像中任意矩形区域和通过如下公式计算:
矩形区域和:
矩形区域和用图二的积分图像也是使用的:
如:9 + 1 - 3 -3 = 4 正好的是中心的值4。
二、积分图计算:cv::integral() 函数
函数原型C++(程序 / 49):
void cv::integral( inputArray src, OutputArray sum, OutputArray sqsum,
OutputArray titled, int sdepth = -1, int sqdepth = -1 )
src,输入图像 W x H 8位浮点数或者32f,64f;
sum,积分图像为,必须为(W +1)x(H+1),类型为32位或64位浮点数;
sqsum,平方像素值的积分图像,它是 (W +1)x(H+1)双精度64f数组;
titled,旋转45度的图像积分,它与sum相同数据类型;
sdepth,期望的积分深度和倾斜的积分图像,CV_32S,CV_32F或CV_64F;
sqdepth,要求的深度的积分图像的平方像素值,CV_32F或CV_64F。
三、代码示例
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("chepai.jpg", 0);
imshow("srcImage", srcImage);
Mat sum = Mat::zeros(srcImage.rows +1, srcImage.cols + 1, CV_32FC1);
Mat sqsum = Mat::zeros(srcImage.rows + 1, srcImage.cols + 1, CV_64FC1);
integral(srcImage, sum, sqsum, CV_32FC1, CV_64FC1);
// 归一化方便显示
Mat result;
normalize(sum, result, 0, 255, NORM_MINMAX, CV_8UC1);
imshow("result", result);
waitKey(0);
return 0;
}
四、结果
结果刚好与积分图的原理一样,右下角值最大: