【OpenCV 4】图像积分图算法:integral()

2023-10-07 20:30

本文主要是介绍【OpenCV 4】图像积分图算法:integral(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、编程环境:

OpenCV 4.1.0
IDEVisual Studio 2017 Enterprise (15.9.14)
操作系统Windows 10 x64 中文专业版 (1903)

二、图像积分图算法:

积分图像是Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度,是一种快速计算图像区域和与平方和的算法。

其核心思想是对每个图像建立自己的积分图查找表,在图像积分处理计算阶段根据预先建立的积分图查找表,直接查找从而实现对均值卷积线性时间计算,做到了卷积执行的时间与半径窗口大小的无关联。

图像积分图在图像特征提取 HAAR/SURF、二值图像分析、图像相似相关性NCC计算、图像卷积快速计算等方面均有应用,是图像处理中的经典算法之一。

图像积分图建立与查找 在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和, 其中(x,y)是图像像素点坐标。

三、程序说明:

  • OpenCV 中的 integral()函数:
void integral( InputArray src, OutputArray sum,OutputArray sqsum, int sdepth = -1, int sqdepth = -1 );

 第1个参数 src:输入图像。

第2个参数 sum:和表。 

第3个参数 sqsum:平方和表。

第4个参数 tilted:瓦块和表。

第5个参数 sdepth : 默认值-1。和表数据深度常见CV_32S。

第6个参数 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("../images/test.jpg");if (src.empty()) {printf("不能打开图像!\n");return -1;}namedWindow("input", WINDOW_AUTOSIZE);imshow("input", src);// 计算积分图Mat sum, sqrsum;integral(src, sum, sqrsum, CV_32S, CV_32F);// 积分图应用edge_demo(src, sum);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("blur_demo", 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("edge_demo", 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;
}

四、运行效果:

 

这篇关于【OpenCV 4】图像积分图算法:integral()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160239

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.