计算直方图calcHist

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

gray

既然已知数字的范围包括256个值, 我们能够将这个范围切割成子区域(称作 bins),如:

bins

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

hist1

直方图能够统计的不不过颜色灰度,它能够统计不论什么图像特征(如梯度,方向等等)。

直方图详细细节

dims: 须要统计的特征的数目,在上例中,dims = 1由于我们只统计了灰度值(灰度图像)
bins: 每一个特征空间子区段的数目,在上例中,bins = 16
range: 每一个特征空间的取值范围,在上例中,range = [0,255]

OpenCV的直方图计算

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

void calcHist(
const Mat* arrays,            // 图像源数组,相同深度(CV_8U or CV_32F),相同大小
int narrays,                 // 图片个数
const int* channels,         // 通道
InputArray mask,             // 掩码图像
OutputArray hist,             // 返回的直方图
int dims,                     // 直方图的维数
const int* histSize,         // 每一维上直方图的个数
const float** ranges,        // 像素值的范围
bool uniform=true,
bool accumulate=false );

说明:

channels - 用来计算直方图的channels的数组
mask - 掩码。假设mask不为空,那么它必须是一个8位(CV_8U)的数组,而且它的大小的和arrays[i]的大小同样,值为1的点将用来计算
dim - 直方图的维数。必须为正,而且不大于CV_MAX_DIMS(当前的OpenCV版本号中为32,即最大能够统计32维的直方图)
histSize - 在每一维上直方图的个数。简单把直方图看作一个一个的竖条的话,就是每一维上竖条的个数
ranges - 用来进行统计的范围

反投影直方图

反向投影是一种记录给定图像中的像素点怎样适应直方图模型像素分布的方式。
简单的讲,所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。

void calcBackProject(
const Mat* arrays,
int narrays,
const int* channels,
InputArray hist,
OutputArray backProject,
const float** ranges,
double scale=1, bool uniform=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

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

阈值化

阈值是最简单的图像切割的方法。
应用举例:从一副图像中利用阈值切割出我们须要的物体部分(当然这里的物体能够是一部分或者总体)。这种图像切割方法是基于图像中物体与背景之间的灰度差异,并且此切割属于像素级的切割。
为了从一副图像中提取出我们须要的部分,应该用图像中的每个像素点的灰度值与选取的阈值进行比較,并作出对应的推断。(注意:阈值的选取依赖于详细的问题。即:物体在不同的图像中有可能会有不同的灰度值。)
一旦找到了须要切割的物体的像素点,我们能够对这些像素点设定一些特定的值来表示。(比如:能够将该物体的像素点的灰度值设定为:‘0’(黑色),其它的像素点的灰度值为:‘255’(白色);当然像素点的灰度值能够随意,但最好设定的两种颜色对照度较强,方便观察结果)。

Threshold_Example

阈值类型

Threshold Type 1

Threshold Type 2

Threshold Type 3

Threshold Type 4

Threshold Type 5

阈值API

double threshold(
InputArray src,
OutputArray dst,
double thresh,
double maxVal,
int thresholdType);

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

该函数利用了迭代物体搜索算法,它要以一个物体的反射直方图(back projection)和初始位置作为输入。
搜索窗体的重心向反射直方图的质心(mass center)移动,该过程不断的反复,直到达到了迭代的次数(criteria.maxCount),或者窗体中心小于一个阈值(criteria.epsilon)。

int meanShift(
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()得到。

RotatedRect CamShift(
InputArray probImage,         // Back projection of the object histogram
Rect& window,                 // Initial search window
TermCriteria criteria        // Stop criteria for the underlying meanShift()
);

TermCriteria模板类

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

TermCriteria(int type, int maxCount, double epsilon);

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

參考资料

OpenCV Histograms API文档
直方图之calcHist使用
直方图之calcHist使用(补)
OpenCV 教程 imgproc模块
反向投影
阈值操作

转载请注明作者Jason Ding及其出处
Github主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)

转载于:https://www.cnblogs.com/gcczhongduan/p/4262082.html

【计算机视觉】OpenCV中直方图处理函数简述相关推荐

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

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

  2. OpenCV中直方图处理函数简述

    转自 机器人2025 作者Jason Ding 计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列预定义的bins中.这里的数据不仅仅指的是灰度值 ,统计数据可能是任何能 ...

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

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

  4. Opencv中直方图函数calcHist

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

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

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

  6. OpenCV中直方图均衡化

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

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

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

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

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

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

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

最新文章

  1. Java问题排查工具清单
  2. SAP freelancer接SAP项目应有底线思维
  3. shell中echo使用单引号时输出单引号
  4. CSS学习04之层次选择器
  5. c++ include 路径_程序员应如何理解include
  6. 【Python】快速认识Pandas的10大索引
  7. C语言使用array实现stack(附完整源码)
  8. the content of the adapter has changed but listview did not
  9. python html5交互方式,python+Django(5)—回传至前端几种方式
  10. java switch case怎么判断范围_java小白从入门到精通(基础二)
  11. java 暂停等返回值在执行_java面试技巧(2)
  12. 学生教育云平台登录入口_学校安全教育平台登录入口
  13. 【转】UNICODE编程资料
  14. astar算法c语言实,Astar寻路算法C++实现
  15. 基于opencv 的OCR小票识别(1)
  16. 探索性与验证性因子分析
  17. 通过JS检测360浏览器
  18. IBM沃森对哈利波特各大主角的人格分析
  19. 银行招考计算机专业考什么,银行笔试一般都考什么?
  20. LaTeX 表格和图片在文中引用时编号显示问题

热门文章

  1. 授予建立视图权限oracle,oracle 建立视图,创建用户并授予查询权限
  2. vue页面fav icon
  3. 网站项目成功管理实践(刘振飞)
  4. java计算机毕业设计视频点播系统源码+系统+数据库+lw文档+mybatis+运行部署
  5. Pytorch打怪路(三)Pytorch创建自己的数据集2
  6. Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步
  7. 计算机绘画教案风车,《风车》幼儿园中班美术教案
  8. 可视化bi平台与大数据分析的关系
  9. 芋道 Spring Boot JPA 入门(一)之快速入门
  10. 安卓平板装MySQL_准备购入一部平板作为学习用具,有推荐的吗?