OpenCV中积分图介绍与应用
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
一:图像积分图概念
积分图像是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函数实现和表查找功能,运行显示:
原图:
模糊效果
边缘效果
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
OpenCV中积分图介绍与应用相关推荐
- 【OpenCV】OpenCV中积分图函数与应用
OpenCV中积分图函数与应用 参考资料 opencv 查找integral,目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/gro ...
- Opencv中的ROI介绍
Opencv中的ROI介绍 (2013-03-27 13:36:26) 转载▼ 分类: 模式识别 ROI(Region of Interest)是指图像中的一个矩形区域,可能你后续 ...
- OpenCV中导向滤波介绍与应用
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导向滤波介绍 导向滤波是使用导向图像作为滤波内容图像,在导向图像上 ...
- OpenCV中的透视变换介绍
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 透视变换原理 透视变换是将图像从一个视 ...
- openCV中waitKey函数介绍
#include <opencv2/opencv.hpp> #include < iostream > #include <window.h> using name ...
- Opencv中视差图显示出来全为黑色
不少网友反映计算出视差图后,显示出来为黑色,我也遇到了这样的问题.今天发现这主要是我们没有对视差图进行Normalize.因为两个摄像头的视差都是集中在一个比较小的范围内.因而显示出来后肉眼辨别不出. ...
- 积分图求局部均值,方差,标准差
积分图求局部均值,方差,标准差 局部 即图像在某个窗口内的值,例如求图像3×3窗口内的均值,方差和标准差 积分图 积分图最重要的作用是快速计算像素值累计,如果公式中包含累加,可以考虑使用积分图的方式. ...
- 【AdaBoost算法】积分图代码实现
一.积分图介绍 定义:图像左上方的像素点值的和: 在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图: 二.代码实现 #include <opencv/highgui.h ...
- OpenCV积分图函数:integral ()介绍
OpenCV积分图函数:integral ()介绍 /************************************************************************* ...
最新文章
- 【 全干货 】5 分钟带你看懂 Docker !
- linux挂载home分区,Linux(CentOS6) 调整 /home 挂载 分区大小
- 【自动驾驶】13. Apollo交通信号灯感知
- java rtmp m3u8_vue常用插件之视频播放(rtmp m3u8)
- SpringMVC框架的介绍
- 如何让ios app支持32位和64位?
- 银行业务队列简单模拟(队列queue)
- [转]apache MPM介绍
- Openfire:安装指南
- 硬盘整数分区最精确地方法(转载)
- 360更新补丁一直提示正在安装_Microsoft .NET Framework 4.7 安装失败,产生阻滞的问题...
- 脑机接口数据分析工具EEGLAB01---安装eeglab
- Android开发视频教程汇总
- AcWing 兔子与兔子
- 哈夫模型-arcgis
- 模拟实现一个银行的取号机
- 批量下载Landsat快视图,为批量下载Landsat Level1数据做准备
- 浅识Flutter 基本组件之showDatePicker方法
- 使用idea构建父子类springboot项目教程,并教你启动子项目(构建项目集合)
- HTML虚拟键盘带声音特效
热门文章
- 一文读懂Python复杂网络分析库networkx | CSDN博文精选
- 让数百万台手机训练同一个模型?Google把这套框架开源了
- 双十一报名截止,决赛在即!AI Challenger2018极客峰会免费抢票!
- 一文详解启发式对话中的知识管理 | 公开课笔记
- Facebook数据丑闻后续:“罪魁”剑桥分析破产,但它还留了一手数据
- Google Brain去年干了太多事,Jeff Dean一篇长文都没回顾完
- GPU对决TPU,英伟达能否守住领先地位?
- 多账号统一登录(实现方案)
- 一行代码,解决空指针问题.
- 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!...