C++ OpenCV特征提取之积分图计算

Stella981
• 阅读 718

前言


什么是积分图像

积分图像的定义:取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,使用这种方式得到的图像称为积分图像。


为什么要用积分图像

直方图的计算方法为遍历图像的全部像素并累计每个强度值在图像中出现的次数。有时仅需要计算图像中某个特定区域的直方图,而如果需要计算图像中多个区域的直方图,这些计算过程将变得非常耗时。在这种情况下使用积分图像将极大地提高统计图像子区域像素的效率。积分图像在程序中应用非常广泛。


如何使用积分图像

假设一幅图像中4个点ABCD,其积分图像中A(_x_1,_y_1)点的值为其左上侧所有像素的值的累加和,也就是蓝色区域中所有像素点的值累加和。同理积分图像中的B(_x_2,_y_1)、C(_x_1,_y_2)、D(_x_2,_y_2)点值分别是绿色、紫色和黄色区域像素值的累加和。ABCD四点的位置关系在右下角图所示。

C++ OpenCV特征提取之积分图计算

那么如果需要计算由ABCD组成的ROI的累加值就只需要使用如下公式:

C++ OpenCV特征提取之积分图计算

即:D-C-B+A。显然,计算量不受区域尺寸的影响。所以,如果需要在多个尺寸的区域上计算像素累加和,最好采用积分图像。


积分图像的API

  • void integral(InputArray image,OutputArray sum, int sdepth=-1 )

  • void integral(InputArray image,OutputArray sum, OutputArray sqsum, int sdepth=-1 )

  • void integral(InputArray image,OutputArray sum, OutputArray sqsum, OutputArray tilted,int sdepth=-1 )

函数参数:

  • image 输入_W_×_H_源图像,8bit字符型,或32bit、64bit浮点型矩阵

  • sum 输出(W+1)×(H +1)积分图像,32bit整型或32bit、64bit浮点型矩阵

  • sqsum 输出(W+1)×(H +1)平方积分图像,双精度浮点型矩阵。

  • tilted 输出旋转45°的(W+1)×(H +1)积分图像,数据类型同sum

  • sdepth  积分图像sum或titled的位深度:CV_32S、CV_32F或CV_64F

注:上面计算出来的图像必须row和col加1,因为边缘也要计算,如果不加一也会报错。

代码演示

我们再新建一个项目名为opencv--integral,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法

C++ OpenCV特征提取之积分图计算

计算积分图

C++ OpenCV特征提取之积分图计算

注意的就是上面创建sumii和sqsumii的时候要记得是源图像的宽和高度都+1;

在显示的前的图像我们要进行normlize归一化的处理

C++ OpenCV特征提取之积分图计算

归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。

归一化的目的简而言之,是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。

接下来我们看一下运行起来的计算结果

C++ OpenCV特征提取之积分图计算

右的就是我们经常积分图计算出来的图像效果。


-END-

长按下方二维码关注微卡智享

C++ OpenCV特征提取之积分图计算

本文分享自微信公众号 - 微卡智享(VaccaeShare)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Android OpenCV(二十二):边缘检测
边缘检测什么是图像的边缘?图像的边缘是图像最基本的特征之一。所谓边缘(或边沿)是指周围像素灰度有跳跃性变化或“屋顶”变化的那些像素的集合。边缘是图像局部强度变化最明显的地方,它主要存在于目标与目标、目标与背景、区域与区域之间,因此它是图像分割依赖的重要特征。从本质上说,图像边缘是图像局部特性不连续性(灰度突变、颜色突变、纹理结构
Wesley13 Wesley13
3年前
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
1.几何变换的基本概念  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:1.原图像任意像素
可莉 可莉
3年前
14、OpenCV实现图像的空间滤波——图像锐化及边缘检测
1、图像锐化理论基础1、锐化的概念   图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反。而且从算子可以看出来,平滑是基于对图像领域的加权求和或者说积分运算的,而锐化则是通过其逆运算导数(梯度)或者说有限差分来实现的。2、图像的一阶微分和二阶
Stella981 Stella981
3年前
Python实现图像信息隐藏
Python实现图像信息隐藏之前学习密码学的时候老师有提到过『信息隐藏』,现在用图像的方法尝试一下。思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢复过来原理从源图中提取文字图像信息,记录这个文字图像信息像素点在图像矩阵中的位置对载体图片进行预处理,将B通道的像素值全部设置
Stella981 Stella981
3年前
Opencv笔记(二十)——直方图(二)
直方图均衡化原理:  想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以你应该把它的直方图做一个横向拉伸(如下图),这就是直方图均衡化要做的事情。通常情况下这种操作会改善图像的对比度。直方图均衡化后面潜在的数
Stella981 Stella981
3年前
Dicom关键概念
数据格式    DICOM将信息分组到datasets中,这意味着胸部X射线图像的文件实际上包含文件中的患者ID,因此图像永远不会被错误地与该信息分开。类似的,JPEG等图像格式也可以使用嵌入式tags中。    DICOM数据对象由许多属性组成,包括名字,ID等,还有一个包含图像像素数据的特殊属性。单个DICOM对象只能包含一个包含像素数
Stella981 Stella981
3年前
Python OpenCV实例:图像直方图均衡化(数学公式简单实现)
coding:utf8'''直方图均衡化作用:通常用来增加图像局部对比度,尤其在图像的有用数据的对比度相当接近时,通过直方图均衡化,图像的亮度可以更好地在直方图上分布基本思想:把原始图像的直方图变换为均匀分布的形式,增加了像素灰度值的动态范围,从而增强图像的整