转自 机器人2025

作者Jason Ding

计算直方图calcHist

直方图是对数据集合的统计 ,并将统计结果分布于一系列预定义的bins中。这里的数据不仅仅指的是灰度值 ,统计数据可能是任何能有效描述图像的特征。

假设有一个矩阵包含一张图像的信息 (灰度值 0-255):

既然已知数字的范围包含256个值, 我们可以将这个范围分割成子区域(称作 bins),如:

然后再统计掉入每一个bin_{i}的像素数目。采用这一方法来统计上面的数字矩阵,我们可以得到下图( x轴表示 bin, y轴表示各个bin中的像素个数)。

直方图可以统计的不仅仅是颜色灰度,它可以统计任何图像特征(如梯度,方向等等)。

直方图具体细节

dims: 需要统计的特征的数目,在上例中,dims = 1因为我们仅仅统计了灰度值(灰度图像)

bins: 每个特征空间子区段的数目,在上例中,bins = 16

range: 每个特征空间的取值范围,在上例中,range = [0,255]

OpenCV的直方图计算

OpenCV提供了一个简单的计算数组集(通常是图像或分割后的通道)的直方图函数calcHist。支持高达32维的直方图。

1

2

3

4

5

6

7

8

9

10

11

voidcalcHist(

constMat* arrays, // 图像源数组,同样深度(CV_8U or CV_32F),同样大小

intnarrays, // 图片个数

constint* channels, // 通道

InputArray mask, // 掩码图像

OutputArray hist, // 返回的直方图

intdims, // 直方图的维数

constint* histSize, // 每一维上直方图的个数

constfloat** ranges, // 像素值的范围

booluniform=true,

boolaccumulate=false);

说明:

channels - 用来计算直方图的channels的数组

mask - 掩码。如果mask不为空,那么它必须是一个8位(CV_8U)的数组,并且它的大小的和arrays[i]的大小相同,值为1的点将用来计算

dim - 直方图的维数。必须为正,并且不大于CV_MAX_DIMS(当前的OpenCV版本中为32,即最大可以统计32维的直方图)

histSize - 在每一维上直方图的个数。简单把直方图看作一个一个的竖条的话,就是每一维上竖条的个数

ranges - 用来进行统计的范围

反投影直方图

反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式。

简单的讲,所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。

1

2

3

4

5

6

7

8

voidcalcBackProject(

constMat* arrays,

intnarrays,

constint* channels,

InputArray hist,

OutputArray backProject,

constfloat** ranges,

doublescale=1, booluniform=true);

hist - 输入直方图

backProject - 反投影向量,这是一个单通道的向量,和arrays[0]具有相同的大小和深度

下面使用肤色直方图为例来解释反向投影的工作原理:

使用模型直方图(代表手掌的皮肤色调)来检测测试图像中的皮肤区域,

  • 对测试图像中的每个像素 ( p(i,j) ),获取色调数据并找到该色调( h(i,j), s(i,j) )在直方图中的bin的位置

  • 查询 模型直方图 中对应的bin( h(i,j), s(i,j) )并读取该bin的数值

  • 将此数值储存在新的图像中(BackProjection)。 你也可以先归一化 模型直方图 ,这样测试图像的输出就可以在屏幕显示了

  • 通过对测试图像中的每个像素采用以上步骤, 得到 BackProjection 结果图

  • 使用统计学的语言, BackProjection 中储存的数值代表了测试图像中该像素属于皮肤区域的概率。比如以上图为例, 亮起的区域是皮肤区域的概率更大(事实确实如此),而更暗的区域则表示更低的概率

阈值化

阈值是最简单的图像分割的方法。

应用举例:从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。

为了从一副图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应的判断。(注意:阈值的选取依赖于具体的问题。即:物体在不同的图像中有可能会有不同的灰度值。)

一旦找到了需要分割的物体的像素点,我们可以对这些像素点设定一些特定的值来表示。(例如:可以将该物体的像素点的灰度值设定为:‘0’(黑色),其他的像素点的灰度值为:‘255’(白色);当然像素点的灰度值可以任意,但最好设定的两种颜色对比度较强,方便观察结果)。

阈值类型

阈值API

1

2

3

4

5

6

doublethreshold(

InputArray src,

OutputArray dst,

doublethresh,

doublemaxVal,

intthresholdType);

均值漂移(Mean Shift)算法函数

该函数利用了迭代物体搜索算法,它要以一个物体的反射直方图(back projection)和初始位置作为输入。

搜索窗口的重心向反射直方图的质心(mass center)移动,该过程不断的重复,直到达到了迭代的次数(criteria.maxCount),或者窗口中心小于一个阈值(criteria.epsilon)。

1

2

3

4

5

intmeanShift(

InputArray probImage, // Back projection of the object histogram

Rect& window, // Initial search window

TermCriteria criteria // Stop criteria for the iterative search algorithm.

);

Camshift算法函数

该函数首先利用meanShift()函数找到物体的中心,然后调整窗口的大小并找到最优的旋转角度。该函数返回一个rotated rectangle数据结构(包含物体的位置,大小和旋转角度)。下一次搜索窗口的位置可以通过RotatedRect::boundingRect()得到。

1

2

3

4

5

RotatedRect CamShift(

InputArray probImage, // Back projection of the object histogram

Rect& window, // Initial search window

TermCriteria criteria // Stop criteria for the underlying meanShift()

);

TermCriteria模板类

该类是作为迭代算法的终止条件使用的,其构造函数需要三个参数:一个是类型,第二个参数为迭代的最大次数,最后一个是特定的阈值。

1

TermCriteria(inttype, intmaxCount, doubleepsilon);

类型有CV_TERMCRIT_ITER、CV_TERMCRIT_EPS、CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,分别代表着迭代终止条件为达到最大迭代次数终止,迭代到阈值终止,或者两者都作为迭代终止条件。

参考资料

机器学习技法课程,林轩田,台湾大学

转载请注明作者Jason Ding及其出处

OpenCV中直方图处理函数简述相关推荐

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

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

  2. 【计算机视觉】OpenCV中直方图处理函数简述

    计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...

  3. opencv-python 详解直方图均衡(二)《再详细介绍直方图以及OpenCV中提供的函数使用》

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 传送门: 详解直方图均衡(一)<图像增强.灰度变换和直方图均衡化关系> ...

  4. Opencv中直方图函数calcHist

    Opencv中直方图函数calcHist calcHist函数在Opencv中是极难理解的一个函数,一方面是参数说明晦涩难懂,另一方面,说明书给出的实例也不足以令人完全搞清楚该函数的使用方式.最难理解 ...

  5. OpenCV中直方图均衡化

    OpenCV中直方图均衡化 首先知道直方图是个什么鬼?在一幅图像中,直方图所体现的是每个像素值在所有的像素中所占的比例:例值为127的像素点的个数/图像总的像素点的个数\color{#f00}值为12 ...

  6. 详解为什么OpenCV的直方图计算函数calcHist()计算出的灰度值为255的像素个数为0

    在使用OpenCV的直方图计算函数calcHist()时,发现灰度值为255的像素个数总是为0. 哪怕图像中灰度值为255的像素个数不为0,使用OpenCV的直方图计算函数calcHist()计算出的 ...

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

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

  8. OpenCV中直方图反向投影算法详解与实现

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自:opencv学堂 一:直方图交叉 OpenCV中直方图反向 ...

  9. opencv中伪彩色applyColorMap函数(C++ / Python)

    opencv中伪彩色applyColorMap函数(C++ / Python) 翻译 2017年06月23日 15:34:12 标签: 1654

最新文章

  1. 进程内存分配和/proc/xxx/maps简单分析
  2. [北航软工]第一次团队作业
  3. git常用命令,项目删除原有github连接并重新连接,回滚,下拉分支代码,切换分支
  4. voip和rtc_为什么开发WebRTC与VoIP开发不一样?(上)
  5. 支付宝小程序面向个人开发者公测
  6. Ubuntu18.04 + CUDA10.0 + tensorflow-gpu 安装过程
  7. mysql自动关闭_服务器mysql数据库老自动停止,请问怎么回事
  8. 得到客户端的真实屏幕分辨率
  9. 机器学习的1000+篇文章总结
  10. 会议记录管理系统java_项目文档--会议记录标准与模板
  11. 基于网络电子海图的海洋气象信息服务系统
  12. run.gps+trainer+uv+for+android,在Android 2.1(三星spica i5700)蓝牙问题,配对工程,但连接不工作...
  13. python创作音乐: 计算机创作,计算音乐
  14. android壁纸制作,安卓动态壁纸制做壁纸的方法教程
  15. Python学习打卡【Task3】异常处理
  16. 【2019/07/20测试 T2】切题
  17. 自动化运维学习--python
  18. 应届生入职制造业感悟
  19. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率期望
  20. php百度地图接口两点测距,百度地图Api 根据两个坐标点计算距离

热门文章

  1. 应用密码学(张仕斌)第五章
  2. Camtasia2022屏幕录像编辑软件套装应用
  3. 【蓝桥杯冲刺 day23】第二点五个不高兴的小明 --- O(n^2)优化思路
  4. 唐纳德与子串 Hard
  5. Centos7 SSH远程登录十分缓慢的解决方案
  6. 进程间通信:命名管道FIFO(2)
  7. SRRC认证的周期、费用多少?要什么资料?
  8. 我的嵌入式linux开发步骤
  9. DHCP简单拓扑图演示
  10. QUIC 协议是如何在蚂蚁集团落地的?