为什么要用积分图像
直方图的计算方法为遍历图像的全部像素并累计每个强度值在图像中出现的次数。有时仅需要计算图像中某个特定区域的直方图
而如果需要计算图像中多个区域的直方图这些计算过程将变得非常耗时。在这种情况下使用积分图像将极大地提高统计图像子区域像素的效率。积分图像在程序中应用非常广泛
什么是积分图像
积分图像的定义:取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,使用这种方式得到的图像称为积分图像
#include
#include
#include
#include
using namespace cv;
using namespace std;
Mat src, dst;
void lntegraImage(int, void*);
int main()
{
src = imread("D:/实验台/机器视觉/测试图片/灰色衬衫.jpg",IMREAD_GRAYSCALE);//加载为灰度图像
if (src.empty())//如果src这个数据库属性为空
{
cout << "无法打开" << endl;
return -1;
}
imshow("原图", src);
lntegraImage(0, 0);
waitKey(0);
return 0;
}
void lntegraImage(int, void*)
{
Mat sumii = Mat::zeros(src.rows+1,src.cols+1,CV_32FC1);
Mat sqsumii = Mat::zeros(src.rows + 1, src.cols + 1, CV_64FC1);
Mat titled = Mat::zeros(src.rows + 1, src.cols + 1, CV_32FC1);
//注:准备计算出来的图像在原图的基础上必须row和col加1,因为边缘也要计算,如果不加一也会报错
integral(src,sumii,sqsumii,titled);
//todocv::integral() 积分图计算函数
//1.inputArray src -- 输入图像 大小WXH
//可以是灰度图或RGB彩色图,单通道和三通道均可作为输入,但每个通道的精度必须是8位int或32位、64位浮点型
//2.OutputArray sum -- 输出的积分图图像 必须为(W +1)x(H+1)
//积分图,若输入src是灰度图,则积分图也是灰度图,若输入src是RGB三通道图,则积分图sum也是RGB三通道彩色
//sum的图像深度是32位整型或32位、64位浮点型,这取决于第三个参数sdepth的定
//3.OutputArray sqsum --输出(W+1)×(H +1)平方积分图像,双精度浮点型矩阵
//4.OutputArray titled --输出旋转45°的(W+1)×(H +1)积分图像,数据类型同sum
//5.int sdepth = -1 -- 标准求和目标图像深度 CV_32S,CV_32F或CV_64F(-1表示不进行调节)
//6.int sqdepth= -1 --平方求和目标图像深度CV_32F或CV_64F
//归一化处理压制极大值和极小值
Mat iiresult;
normalize(sumii, iiresult,0,255, NORM_MINMAX, CV_8UC1, Mat());
normalize(sqsumii, sqsumii, 0, 255, NORM_MINMAX, CV_8UC1, Mat());
normalize(titled, titled, 0, 255, NORM_MINMAX, CV_8UC1, Mat());
//Haar特征检测需要积分图
imshow("生成的积分图",iiresult);
imshow("生成的平方积分图像", sqsumii);
imshow("生成旋转45度的积分图像", titled);
}
积分图的原理及应用
https://www.cnblogs.com/magic-428/p/9149868.html