/**************************************************************************************************/
// 函数名称:OnMenu020503()
// 函数功能:“对角积分图”菜单。
// 函数参数:
//     输入参数: 无
//     输出参数: 无
// 返 回 值:void
// 创建作者:(QQ:370711753)
// 修改日期:2017/11/08 16:25:58
/**************************************************************************************************/
void COpenCVDlg::OnMenu020503()
{
    try    // 错误处理
    {
        Mat lv_MatImageIntegralSum = Mat();
        Mat lv_MatImageIntegralSqSum = Mat();
        Mat lv_MatImageIntegralTilted = Mat();
        Mat lv_MatImageIntegralNorm = Mat();  
        // 计算积分图像
        cv::integral(m_MatImageRead, lv_MatImageIntegralSum,
            lv_MatImageIntegralSqSum, lv_MatImageIntegralTilted, CV_64F, CV_64F);
        // 图像数据归一化
        cv::normalize(lv_MatImageIntegralTilted, lv_MatImageIntegralTilted, 0, 255, CV_MINMAX);
        convertScaleAbs(lv_MatImageIntegralTilted,lv_MatImageIntegralNorm);        // 精度转换为8位INT整型 
        // 显示结果
        HV_ImageShow(lv_MatImageIntegralNorm, m_strNameWindow);
    }
    catch (Exception& lv_Exception)        // 抛出异常
    {
        CString lv_strException = _T("");
        lv_strException.Format(_T(":%s!"), lv_Exception.what());
        MessageBox(lv_strException, _T("错误!"), MB_ICONERROR);   
        return;
    }
    return;
}

//************************************************

Opencv中的积分图算法

积分图算法由Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度。积分图算法是一种快速计算图像区域和以及图像区域平方和的算法。它的核心思想就是对每一个图像建立起自己的积分图查找表,在图像处理的阶段就可以根据预先建立积分图查找表直接查找从而实现对均值卷积的线性时间计算。做到了卷积执行的时间与窗口大小无关。这种算法被应用到基于NCC的快速匹配、对象检测和SURF变换、边缘检测、基于统计学的快速滤波器等方面。

积分图算法的缺点:1、需要较大的内存来存储积分图。2、如果图片较大,会导致数据溢出。

  • 积分图的建立

积分图由原图像计算而来,假设原图大小为W*H,则积分图大小为(W+1)*(H+1)。在积分图(integral image)上任意坐标(x,y)处的值,表示原图中坐标为(x,y)的点的左上角所有像素点像素值的和(平方和表中的就是平方和)。和表和平方和表建立公式如下:

和表:

平方和表:

如下图所示,假设输入图像大小为2x2,则积分图大小为3x3

  • 积分图的查找

如上图所示,如果想求输入图像中蓝色区域内的像素值之和(3+2+5+4=14),只要根据和表积分图进行两次减法和一次减法即可:46+10-22-20=14。也就是右下角+左上角-右上角-左下角。

  • Opencv实例

opencv中计算积分图的API介绍:

  1. //API一

  2. void integral( InputArray src, //输入图像

  3. OutputArray sum, //和表

  4. int sdepth = -1,); //和表深度

  5. //API二

  6. void integral( InputArray src, //输入图像

  7. OutputArray sum, //和表

  8. OutputArray sqsum, //平方和表

  9. int sdepth = -1, //和表深度,一般为CV_32S

  10. int sqdepth = -1 ); //平方和表深度,一般为CV_32F

计算积分图并显示:

       

  1. //

  2. //opencv4.1.0

  3. //

  4. #include <opencv2/opencv.hpp>

  5. using namespace std;

  6. using namespace cv;

  7. int main() {

  8. Mat src, sum, sqrsum;

  9. src = imread("1.png", 0);

  10. integral(src, sum, sqrsum, CV_32S, CV_32F);

  11. normalize(sum, sum, 0, 255, NORM_MINMAX, CV_8UC1, Mat());

  12. normalize(sqrsum, sqrsum, 0, 255, NORM_MINMAX, CV_8UC1, Mat());

  13. imshow("原图", src);

  14. imshow("和表积分图", sum);

  15. imshow("平方和表积分图", sqrsum);

  16. waitKey(0);

  17. return 0;

  18. }

  • 获取指定区域内像素值之和

  1. //

  2. //opencv4.1.0

  3. //

  4. #include <opencv2/opencv.hpp>

  5. using namespace std;

  6. using namespace cv;

  7. int get_block_sum(Mat &sum, int x1, int y1, int x2, int y2);

  8. int main() {

  9. Mat src, sum, sqrsum;

  10. src = imread("1.png", 0);

  11. //获取ROI,便于观察(使用ImageWatch插件)

  12. int LR = 4;

  13. int LC = 4;

  14. int width = 6;

  15. int height = 6;

  16. Mat roi = src(Rect(LR, LC, width, height)).clone();

  17. //计算积分图

  18. integral(src, sum, sqrsum, CV_32S, CV_32F);

  19. //利用积分图计算ROI内的像素值总和

  20. int value = get_block_sum(sum, LR, LC, LR + height, LC + width);

  21. cout << value << endl;

  22. imshow("原图", src);

  23. waitKey(0);

  24. return 0;

  25. }

  26. int get_block_sum(Mat &sum, int x1, int y1, int x2, int y2) {

  27. int BottomRight = sum.at<int>(x2, y2);

  28. int TopLeft = sum.at<int>(x1, y1);

  29. int TopRight = sum.at<int>(x1, x2);

  30. int BottomLeft = sum.at<int>(x2, y1);

  31. int sum_value = (BottomRight + TopLeft - TopRight - BottomLeft);

  32. return sum_value;

  33. }

//********************************************

Paul Viola和Michael Jones在2001年首次将积分图应用在图像特征提取上,在他们的论文“Rapid Object Detection using a Boosted Cascade of Simple Features”中,积分图被当作一种新的图像特征表征方式,可以把检测的Haar特征非常高效的计算出来,用于实时人脸检测系统。

积分图是一种能够描述全局信息的矩阵表示方法,其构造方式是积分图像上位置(i,j)处的值ii(i,j)是原图像(i,j)左上角方向所有像素的和。

利用积分图可以可以快速的计算图像上某一区域内的像素和,如下图:

要计算区域D内的像素和,只需要获取到积分图上1、2、3/4点各自的像素值,分别表述为ii(1)、ii(2)、ii(3)、ii(4),则区域D的像素和=ii(4)+ii(1)-ii(2)-ii(3)。

传统的计算像素和的方式需要遍历区域D内所有的像素,再执行累加,计算量随着区域D面积的增大而增大,而对积分图方式来说,只需要在计算积分图之后,通过简单几次加减运算就可以得到某一区域内“像素和”这一特征,计算速度非常快,并且这种速度的提升效果随着区域面积的增大和计算次数的增多表现的更为明显。

Opencv中使用integral函数计算积分图。

void integral( InputArray src, OutputArray sum, int sdepth=-1 );

第一个参数src,可以使灰度图或RGB彩色图,单通道和三通道均可作为输入,但每个通道的精度必须是8位int或32位、64位浮点型;

第二个参数sum,积分图,若输入src是灰度图,则积分图也是灰度图,若输入src是RGB三通道图,则积分图sum也是RGB三通道彩色。sum的图像深度是32位整型或32位、64位浮点型,这取决于第三个参数sdepth的定义;

第三个参数sdepth,定义积分图的深度(depth),32位整型或者32位、64位浮点型。注意图像的深度跟图像的通道数是无关的,相关概念可以参看这里:Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解 ;

所以在使用sum之前,声明即可,可以不事先定义Mat矩阵的大小和数据类型。

#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"using namespace cv;int main(int argc,char *argv[])
{Mat image=imread(argv[1]);    //cvtColor(image,image,CV_RGB2GRAY); //原图像是三通道,积分图也是三通道Mat imageIntegral;integral(image,imageIntegral,CV_32F); //计算积分图normalize(imageIntegral,imageIntegral,0,255,CV_MINMAX);  //归一化,方便显示Mat imageIntegralNorm;convertScaleAbs(imageIntegral,imageIntegralNorm); //精度转换为8位int整型imshow("Source Image",image);imshow("Integral Image",imageIntegralNorm);waitKey();
}

原图:

积分图:

显示的积分图是经过归一化后的。可以看到从左上角到右下角,图像是越来越亮的,也就是说积分图上像素值是越来越大的。

积分图的图像通道数跟原始图像保存一致,当计算积分图的原始图像是彩色图像时,积分图也是彩色图像,这时候积分图计算的不是灰度,而是颜色:

//************************************

OpenCV积分图函数:integral ()详解相关推荐

  1. OpenCV积分图函数:integral ()介绍

    OpenCV积分图函数:integral ()介绍 /************************************************************************* ...

  2. Opencv双目校正函数 stereoRectify 详解

    目录 函数的[官方解释](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga617b1685d4059c6040827800e72ad2 ...

  3. OpenCV直方图计算函数calcHist详解

    原文转自https://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html 文档是英文的,应该不难看懂,就不给翻译了. ---------- ...

  4. 归一化php,归一化函数normalize详解

    opencv 2 归一化函数normalize详解 1. 归一化定义与作用 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内.首先归一化是为了后面数据处理的方便,其次是保 ...

  5. python normalize函数_归一化函数normalize详解

    opencv 2 归一化函数normalize详解 1. 归一化定义与作用 归一化就是要把需要处理的数据经过处理后 (通过某种算法)限制在你需要的一定范围内.首先归一化是为了后面数据处理的方便,其次是 ...

  6. 归一化函数normalize详解

    opencv 2 归一化函数normalize详解 1. 归一化定义与作用     归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内.首先归一化是为了后面数据处理的方便, ...

  7. 【OpenCV】OpenCV中积分图函数与应用

    OpenCV中积分图函数与应用 参考资料 opencv 查找integral,目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/gro ...

  8. OpenCV函数remap详解

    OpenCV函数remap详解 remap的作用是将原影像映射到目标影像的函数. 这是OpenCV文档中的说明. 但这个描述给人的感觉是,云里雾里,到底是需要计算目标到原的映射关系,还是原到目标的映射 ...

  9. Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot/JointGrid/pairplot/PairGrid/FacetGrid密度图等的函数源代码详解之最强攻略

    Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot/JointGrid/pairplot/PairGrid/FacetGrid折线图/柱状图+散点图/矩形密度图的 ...

最新文章

  1. python的windows出现问题_Windows下使用python库 curses遇到错误消息的解决方案
  2. 释放Linux磁盘空间方法
  3. Blockchain技术之区块链的应用领域——智能合约
  4. 微软为.NET程序员带来了最优的跨平台开发体验-WSL
  5. oracle错误12637,TNS-12537 TNSconnection closed ORA-609错误处理
  6. 【C语言笔记初级篇】第八章:简单调试
  7. 002A demo of the Spectral Co-Clustering algorithm
  8. MvcMusicStore学习中常出现的一个BUG
  9. Android:Toolbar的图标尺寸问题
  10. 虎牙面试官:String长度有限制吗?是多少?我:这太...
  11. 学生选课系统项目分析-1,架构
  12. M2M技术、标准与智慧城市顶层设计方法
  13. 股票历史数据-历史数据股票工具
  14. Linux ALSA声卡驱动
  15. 钉钉小程序添加vant组件库
  16. 计算机病毒安全问题,内网安全中致命问题--“计算机病毒”
  17. 计算机系统导论与计算机导论,计算机系统导论之学习心得
  18. Jetpack 新成员 AndroidX App Startup 实践以及原理分析
  19. js在ie下打开对话窗口的方式
  20. php表格好看样式,怎么用css制作好看的表格?【示例】

热门文章

  1. seo自动发布外链工具_没资源、零经验,如何建立高质量外链?
  2. 混合音乐推荐系统_比女朋友更懂你的“音乐推荐系统”,是怎样搭建出来的?...
  3. python数学计算函数_Python 内置函数(数学运算类,逻辑判断类)
  4. axure 小程序 网盘_万门大学微信小程序实战开发特训班【完结】网盘高清全套最新系列精品课程...
  5. netsh interface portproxy 转发不生效_SecureCRT远程端口转发不生效的解决方法
  6. oracle 加全文索引,oracle全文索引的创建和使用
  7. python大作业爬虫_Python大作业---微博爬虫及简单数据分析
  8. python 重命名的方法_Python下OS模块重命名方法renames
  9. python贪吃蛇设计目标_基于 pygame 设计贪吃蛇游戏
  10. 只会用单片机点灯,很丢人吗?