OpenCV中积分图函数与应用

参考资料

opencv 查找integral,目前网上大部分的资料来自于opencv

  • https://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#gadeaf38d7701d7ad371278d663c50c77d
  • https://blog.csdn.net/jia20003/article/details/52710751
  • https://cloud.tencent.com/developer/article/1084469

一:图像积分图概念

积分图像是Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度。随后这种技术被应用到基于NCC的快速匹配、对象检测和SURF变换中、基于统计学的快速滤波器等方面。积分图像是一种在图像中快速计算矩形区域和的方法,这种算法主要优点是一旦积分图像首先被计算出来我们可以计算图像中任意大小矩形区域的和而且是在常量时间内。这样在图像模糊、边缘提取、对象检测的时候极大降低计算量、提高计算速度。第一个应用积分图像技术的应用是在Viola-Jones的对象检测框架中出现。

上图左侧四个点的矩形区域像素求和,只要根据每个点左上方所有像素和表值,进行两次减法与一次加法即可=》46 – 22 – 20 + 10 = 14

二:OpenCV中积分图函数

OpenCV中通过integral()函数可以很容易的计算图像的积分图,该函数支持和表积分图、平方和表积分图、瓦块和表积分图计算。integral函数与参数解释如下:

void cv::integral(InputArray  src, // 输入图像OutputArray  sum, // 和表OutputArray  sqsum, // 平方和表OutputArray  tilted, // 瓦块和表int sdepth = -1, // 和表数据深度常见CV_32Sint sqdepth = -1 // 平方和表数据深度 常见 CV_32F
)

三:使用积分图函数

通过代码演示计算积分图实现任意窗口大小的盒子模糊与垂直边缘提取,完整的代码实现如下:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;void blur_demo(Mat &image, Mat &sum);
void edge_demo(Mat &image, Mat &sum);
int getblockSum(Mat &sum, int x1, int y1, int x2, int y2, int i);
int main(int argc, char** argv) {Mat src = imread("D:/vcprojects/images/yuan_test.png");if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);namedWindow("output", CV_WINDOW_AUTOSIZE);// 计算积分图Mat sum, sqrsum;integral(src, sum, sqrsum, CV_32S, CV_32F);// 积分图应用int type = 0;while (true) {char c = waitKey(100);if (c > 0) {type = (int)c;printf("c : %d\n", type);}if (c == 27) {break; // ESC}if (type == 49) { // 数字键 1blur_demo(src, sum);}else if (type == 50) { // 数字键 2edge_demo(src, sum);}else {blur_demo(src, sum);}}waitKey(0);return 0;
}void blur_demo(Mat &image, Mat &sum) {int w = image.cols;int h = image.rows;Mat result = Mat::zeros(image.size(), image.type());int x2 = 0, y2 = 0;int x1 = 0, y1 = 0;int ksize = 5;int radius = ksize / 2;int ch = image.channels();int cx = 0, cy = 0;for (int row = 0; row < h + radius; row++) {y2 = (row + 1)>h ? h : (row + 1);y1 = (row - ksize) < 0 ? 0 : (row - ksize);for (int col = 0; col < w + radius; col++) {x2 = (col + 1)>w ? w : (col + 1);x1 = (col - ksize) < 0 ? 0 : (col - ksize);cx = (col - radius) < 0 ? 0 : col - radius;cy = (row - radius) < 0 ? 0 : row - radius;int num = (x2 - x1)*(y2 - y1);for (int i = 0; i < ch; i++) {// 积分图查找和表,计算卷积int s = getblockSum(sum, x1, y1, x2, y2, i);result.at<Vec3b>(cy, cx)[i] = saturate_cast<uchar>(s / num);}}}imshow("output", result);imwrite("D:/result.png", result);
}/*** 3x3 sobel 垂直边缘检测演示*/void edge_demo(Mat &image, Mat &sum) {int w = image.cols;int h = image.rows;Mat result = Mat::zeros(image.size(), CV_32SC3);int x2 = 0, y2 = 0;int x1 = 0, y1 = 0;int ksize = 3; // 算子大小,可以修改,越大边缘效应越明显int radius = ksize / 2;int ch = image.channels();int cx = 0, cy = 0;for (int row = 0; row < h + radius; row++) {y2 = (row + 1)>h ? h : (row + 1);y1 = (row - ksize) < 0 ? 0 : (row - ksize);for (int col = 0; col < w + radius; col++) {x2 = (col + 1)>w ? w : (col + 1);x1 = (col - ksize) < 0 ? 0 : (col - ksize);cx = (col - radius) < 0 ? 0 : col - radius;cy = (row - radius) < 0 ? 0 : row - radius;int num = (x2 - x1)*(y2 - y1);for (int i = 0; i < ch; i++) {// 积分图查找和表,计算卷积int s1 = getblockSum(sum, x1, y1, cx, y2, i);int s2 = getblockSum(sum, cx, y1, x2, y2, i);result.at<Vec3i>(cy, cx)[i] = saturate_cast<int>(s2 - s1);}}}Mat dst, gray;convertScaleAbs(result, dst);normalize(dst, dst, 0, 255, NORM_MINMAX);cvtColor(dst, gray, COLOR_BGR2GRAY);imshow("output", gray);imwrite("D:/edge_result.png", gray);
}int getblockSum(Mat &sum, int x1, int y1, int x2, int y2, int i) {int tl = sum.at<Vec3i>(y1, x1)[i];int tr = sum.at<Vec3i>(y2, x1)[i];int bl = sum.at<Vec3i>(y1, x2)[i];int br = sum.at<Vec3i>(y2, x2)[i];int s = (br - bl - tr + tl);return s;
}

这里最重要的是要注意到上面的图示,积分图对象的Mat(1,1)对应实际图像Mat(0,0),如果不加处理的话会导致结果有明显的中心迁移。edge_demo实现了积分图查找提取图像边缘、blur_demo函数实现积分图查找图像均值模糊,getblockSum函数实现和表查找功能,运行显示:

【OpenCV】OpenCV中积分图函数与应用相关推荐

  1. OpenCV中积分图介绍与应用

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一:图像积分图概念 积分图像是Crow在1984年首次提出,是为了 ...

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

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

  3. OpenCV积分图函数:integral ()详解

    /**************************************************************************************************/ ...

  4. opencv python 中cv2.putText()函数的用法

    opencv python 中cv2.putText()函数的用法 文章目录: 一.快速使用 二.官方文档 三.使用举例 虽然用啦很多次,还是决定记录一下 一.快速使用 cv2.putText(ima ...

  5. 积分图求局部均值,方差,标准差

    积分图求局部均值,方差,标准差 局部 即图像在某个窗口内的值,例如求图像3×3窗口内的均值,方差和标准差 积分图 积分图最重要的作用是快速计算像素值累计,如果公式中包含累加,可以考虑使用积分图的方式. ...

  6. 使用opencv中的merge()函数为BGR图像添加alpha通道

    先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 # 图像处理 ...

  7. OpenCV图像处理之基于积分图实现NCC快速相似度匹配

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 NCC概述 基于Normalized cross correlat ...

  8. 利用openCV(C++)实现Halcon中的min_max_gray函数的功能

    openCV(c++)实现Halcon中的min_max_gray函数的功能 在halcon中有一个求最大最小灰度值的算子min_max_gray,算子的形式为 min_max_gray(Region ...

  9. 科普丨【计算机视觉】OpenCV中直方图处理函数简述

    作者Jason Ding GitCafe博客主页(http://jasonding1354.gitcafe.io/) 计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列预 ...

最新文章

  1. Android App的启动过程
  2. inspinia中文管理后台_赤峰当地神马推广后台哪里有
  3. 【朝花夕拾】Android性能篇之(二)Java内存分配
  4. java读取文件替换字符,跳槽薪资翻倍
  5. GitBook使用教程
  6. python---------sys.argv的作用
  7. leetcode 337. House Robber III | 337. 打家劫舍 III(树形dp;什么情况下dp需要强制包含当前元素?)
  8. 同步外部接口数据的一些记录和分享
  9. 调用gensim库训练word2vec词向量
  10. django和mysql如何建模_Django中的多个数据库和多个模型
  11. ES6学习(九)—Generator 函数的语法
  12. php设置文字大小、,html字体大小怎么设置
  13. 用python怎样解偏微分方程组_用Python数值求解偏微分方程
  14. h5 字体加粗_html、css文字加粗方法
  15. vscode远端编程 终极方案
  16. 捋一捋Kafka中的消费者API
  17. 基于facades数据集的图像成任务,完成各种GAN的对比实验
  18. 研读:OASIS:On Achieving a Sanctuary for Integrity and Secrecy on Untrusted Platforms
  19. 解决html中表格线条粗细不一的问题
  20. QMediaplayer详解以及简易音乐播放实现

热门文章

  1. mysql err 1349_MySQL 视图 第1349号错误解决方法
  2. 服务器主机防御系统,主机入侵防御系统
  3. 面板服务器默认是什么系统,免费Linux服务器管理面板,你用的是哪个?
  4. java saf_Java 8 Lambda表达式探险
  5. html display 显示,CSS display显示
  6. ajax返回一段html代码,【提问】ajax请求返回整个html页面
  7. mysql 插入删除操作_MySQL——增删改操作
  8. bitnami redmine mysql_centos7 BitNami一键安装Redmine
  9. @echo off是什么意思_参加CHANEL私享派对是什么体验?Lanvin头一次在中国办大秀??「每周时报」...
  10. Linux下视频截取命令