积分图像计算介绍
图像积分就是某像素点左上角全部图像像素之和,opencv提供算法,可以计算任意一块区域积分和,原理是利用该区域总和减去相邻两块区域和,在加上相邻两块区域的重叠部分(由于多减掉一次)。
积分图像计算相关API
函数API
void integral( InputArray src, OutputArray sum,OutputArray sqsum, int sdepth = -1, int sqdepth = -1 );
函数参数介绍
- src:输入图像。
- sum:计算出来的像素和表。
- sqsum:计算出来的平方和表。
- tilted:计算出来的旋转45度(瓦块)和表。
- sdepth : 默认值-1。和表数据深度常见CV_32S。
- sqdepth: 默认值 -1。平方和表数据深度常见 CV_32F。
代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
#define PIC_PATH "/work/opencv_pic/"
#define PIC_NAME "girl.jpeg"
int main(void)
{
Mat src;
//获取完整的图片路径及名称
string pic = string(PIC_PATH)+string(PIC_NAME);
//打印图片路径
cout << "pic path is :"<<pic<<endl;
//读取图片
src = imread(pic);
//判断图片是否存在
if(src.empty())
{
cout<<"pic is not exist!!!!"<<endl;
return -1;
}
//显示图片
namedWindow("src pic",WINDOW_AUTOSIZE);
imshow("src pic",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 iisum; //积分图归一化
normalize(sumii,iisum,0,255,NORM_MINMAX,CV_8UC1,Mat());
//显示积分图
imshow("计算结果",iisum);
waitKey(0);
destroyAllWindows();
return 0;
}
程序运行效果
可以看到越靠近左下方的点越亮证明值是越大的