计算直方图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)

【计算机视觉】OpenCV中直方图处理函数简述的更多相关文章

  1. OpenCV中的绘图函数-OpenCV步步精深

    OpenCV 中的绘图函数 画线 首先要为画的线创造出环境,就要生成一个空的黑底图像 img=np.zeros((512,512,3), np.uint8) 这是黑色的底,我们的画布,我把窗口名叫做i ...

  2. Opencv中直方图函数calcHist

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

  3. OpenCV中的常用函数

    1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序 ...

  4. openCV中直方图均衡化算法的理解

    直方图均衡化就是调整灰度直方图的分布,即将原图中的灰度值映射为一个新的值.映射的结果直观表现是灰度图的分布变得均匀,从0到255都有分布,不像原图那样集中.图像上的表现就是对比度变大,亮的更亮,暗的更 ...

  5. OpenCV中的新函数connectedComponentsWithStats使用

    主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域. 关键字    :connectedComponentsWithStats 在以前,常用的方法是"是先调用 cv ...

  6. 5、opencv中的绘图函数

    1.目标 a.学习使用 OpenCV 绘制不同几何图形 b. 你将会学习到这些函数: cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse(),c ...

  7. OpenCV中的绘图函数

    OpenCV可以用来绘制不同的集合图形,包括直线,矩形,圆,椭圆,多边形以及在图片上添加文字.用到的绘图函数包括 cv2.line(),cv2.circle(),cv2.rectangle() ,cv ...

  8. Opencv中的阈值函数

    OpenCV基础——threshold函数的使用 图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果. 参数原型 参数说明 src:源图像,可以为8位的灰度 ...

  9. opencv中的exp32f函数

    exp32f opencv的exp函数和cmath的exp函数在精度上存在一定差异,通过查找源码,发现了这么一段实现.代码如下: 点击查看代码 #define EXPTAB_SCALE 6 #defi ...

随机推荐

  1. Oracle实现数据不存在则插入,数据存在则更新(insert or update)

    思路是写一个函数,先按条件查询数据,假设查询到数据则更新.假设没有查询到数据则插入: create or replace function fn_merge_index(statdate in dat ...

  2. 第一个使用Spring Tool Suite(STS)和Maven建立的Spring mvc 项目

    一.目标 在这篇文章中.我将要向您展示怎样使用Spring Frameworks 和 Maven build创建您的第一个J2ee 应用程序. 二.信息 Maven是一个java项目的构建工具(或者自 ...

  3. 【Android开发经验】我们要友好的告诉用户,程序要崩溃了

        转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992     尽管我们的程序在正式上线之前,都会经过严格的測试.从而保证程序的健壮性和良好的用户体验,可是 ...

  4. css页面滚动条出现时防止页面跳动的方法

    大家写页面时应该都遇到过一个问题,尤其是写单页面应用的时候, 在有滚动条页面和没有滚动条页面之间相互跳转时, 你页面的主体内容会向左或者向右抖一下,让强迫症看了很不舒服. 现在就来解救一下强迫症: 方 ...

  5. FZU Problem 2156 Climb Stairs DP

    http://acm.fzu.edu.cn/problem.php?pid=2156 题目大意: 爬楼梯,要爬到n这个位置,每次可以走x也可以走y,然后一定要经过A和B两点,求最终到达n的方案数. 思 ...

  6. 将html转换为word文档的几种方式

    1 基于wps直接将页面信息下载成word文档 public void test() { WPS.Application wps = null; try { wps = new WPS.Applica ...

  7. 每日技术总结:jquery datetimepicker,微博QQ好友QQ空间微信等分享接口

    前言: 1.jquery datetimepicker 今天遇到一个日期控件格式的问题,默认选中显示的并不是设定的值,而是当天的日期.于是去查了一遍文档. 参考文章:jquery datetimepi ...

  8. smack capable(CAP_MAC_OVERRIDE)

    https://blog.csdn.net/ning_wei/article/details/9670947 LINUX中的capable int smk_curacc(char *obj_label ...

  9. CSU1656: Paper of FlyBrother(后缀数组)

    Description FlyBrother is a superman, therefore he is always busy saving the world.  To graduate fro ...

  10. php 面试题一(看视频的学习量比网上瞎转悠要清晰和明了很多)(看视频做好笔记)(注重复习)

    php 面试题一(看视频的学习量比网上瞎转悠要清晰和明了很多)(看视频做好笔记)(注重复习) 一.总结 1.无线分类的本质是树(数据结构)(数的话有多种储存结构可以实现,所以对应的算法也有很多),想到 ...