直方图计算

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

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

怎样去统计两个特征呢? 在这种情况下, 直方图就是3维的了,x轴和y轴分别代表一个特征, z轴是掉入  组合中的样本数目。OpenCV提供了一个简单的计算数组集(通常是图像或分割后的通道)的直方图函数 calcHist 。 支持高达 32 维的直方图。

/// 分割成3个单通道图像 ( R, G 和 B )
vector<Mat> rgb_planes;
split( src, rgb_planes ); /// 设定bin数目
int histSize = 255; /// 设定取值范围 ( R,G,B) )
float range[] = { 0, 255 } ;
const float* histRange = { range }; bool uniform = true; bool accumulate = false; /// 计算直方图:
calcHist( &rgb_planes[0], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
  • &rgb_planes[0]: 输入数组(或数组集)
  • 1: 输入数组的个数 (这里我们使用了一个单通道图像,我们也可以输入数组集 )
  • 0: 需要统计的通道 (dim)索引 ,这里我们只是统计了灰度 (且每个数组都是单通道)所以只要写 0 就行了。
  • Mat(): 掩码( 0 表示忽略该像素), 如果未定义,则不使用掩码
  • r_hist: 储存直方图的矩阵
  • 1: 直方图维数
  • histSize: 每个维度的bin数目
  • histRange: 每个维度的取值范围
  • uniform 和 accumulate: bin大小相同,清楚直方图痕迹

在画直方图之前,先使用 normalize 归一化直方图,这样直方图bin中的值就被缩放到指定范围(这个步骤只是为了让直方图的值可以显示在目标窗口中):

/// 将直方图归一化到范围 [ 0, histImage.rows ]
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );

画出直方图也有一些小技巧(窗口上方y轴坐标为0,向下增长):

/// 在直方图画布上画出直方图
for( int i = 1; i < histSize; i++ )
{
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
Scalar( 0, 0, 255), 2, 8, 0 );
}

以上。

直方图均衡化

直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.

注意:只能对单通道进行均衡化。

equalizeHist( src, dst );

要想实现均衡化的效果, 映射函数应该是一个 累积分布函数 (cdf) (更多细节, 参考*学习OpenCV*). 对于直方图 , 它的 累积分布  是:

要使用其作为映射函数, 我们必须对最大值为255 (或者用图像的最大强度值) 的累积分布  进行归一化. 同上例, 累积分布函数为:

最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:

详细映射过程

直方图对比(计算相似度)

OpenCV 函数 compareHist 执行了具体的直方图对比的任务。该函数提供了4种对比标准来计算相似度:

  1. Correlation ( CV_COMP_CORREL )

    其中

     是直方图中bin的数目。

  2. Chi-Square ( CV_COMP_CHISQR )

  3. Intersection ( CV_COMP_INTERSECT )

  4. Bhattacharyya 距离( CV_COMP_BHATTACHARYYA )

 

double base_test1 = compareHist( hist_base, hist_test1, compare_method );

对于 Correlation 和 Intersection 标准, 值越大相似度越大。而另外两种对比标准,则是结果越小相似度越大。

反向投影

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

  1. 统计原图像的 模型直方图(Hue-Saturation)。
  2. 对测试图像中的每个像素 (  ),获取色调数据并找到该色调(  )在直方图中的bin的位置。

  3. 查询 模型直方图 中对应的bin -  - 并读取该bin的数值。

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

  5. 通过对测试图像中的每个像素采用以上步骤, 我们得到了下面的 BackProjection 结果图:

例如,假如源图像是一张 肤色图,那么测试图像中亮色区域表示其更有可能属于皮肤区域(因为其对应的模型直方图值很高)。

调用函数 calcBackProject 计算图像的反向投影,示例见此

OpenCV学习笔记(十) 直方图操作的更多相关文章

  1. OpenCV学习笔记十九:opencv_gpu*模块

    一,简介: 基于GPU加速的opencv算法库.

  2. OpenCV学习笔记——形态学梯度操作

    代码: #include<cv.h> #include<highgui.h> int main(void) { cvNamedWindow("cmp"); ...

  3. OpenCV学习笔记十八:opencv_flann模块

    一,简介: Fast Library for Approximate Nearest Neighbors (FLANN)算法库.

  4. OpenCV学习笔记十六:opencv_calib3d模块

    一,简介: 该库用于3D信息重建,姿态估计,摄像机标定等.

  5. OpenCV学习笔记十四:opencv_objdetect模块

    一,简介: 该库用于目标检测.

  6. OpenCV学习笔记十五:opencv_features2d模块

    一,简介: 该库用于2D特征检测,描述与匹配.

  7. OpenCV学习笔记十二:opencv_video模块

    一,简介: 该库用于视频运动分析,目标追踪,背景分离等.

  8. OpenCV学习笔记十:opencv_superres模块

    一,简介: 该库用于图像超分辨率重建.即通过硬件或软件的方法提高原有图像的分辨率,通过一系列低分辨率的图像来得到一幅高分辨率的图像.

  9. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  10. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

随机推荐

  1. Docker的安全问题以及一些预防方案

    http://blog.csdn.net/Ruidu_Doer/article/details/53401523

  2. LVS 集群工作原理

    1. 集群:集群(cluster )就是一组计算机,它们作为一个整体向用户提供一组网络资源,单个计算机系统就是一个集群节点(node). 2. 集群种类: <1>. 负载均衡集群(Load ...

  3. Diary

    2019.1.16 233333333 2018.12.5 猜猜我写了什么? 2018.12.3 maya真是越来粤菜了.. 突然发现cf其实有中文 2018.12.1 说好的今天出成绩呢?.. 咕咕 ...

  4. Unity中的输入

    目录 移动平台的输入 触摸 触摸相关的函数 触摸的一个示例 重力加速器 在Unity中访问重力加速器的信息 重力加速器示例 虚拟键盘 其他输入 传统的输入 鼠标,键盘,控制杆,手柄 虚拟控制轴(Vir ...

  5. echo -e的用法

    root@bt:~# echo -e "HEAD /HTTP/1.0\n\n"HEAD /HTTP/1.0 root@bt:~# echo -e "HEAD /HTTP/ ...

  6. v-if与v-show的区别

    一.区别 v-if 动态的向DOM树内添加或者删除DOM元素:“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:在初始渲染条件为假时,什么也不做. v-sho ...

  7. 在MVC中使用NHibernate学习记录

    NHibernate简介: NHibernate是一个面向.net环境的对象/关系数据库映射工具,对象/关系数据库映射(object/relational mapping,ORM)是一种技术,可以将对 ...

  8. jQuery_3_过滤选择器

    过滤选择器(过滤器)类似于CSS3里的伪类,包含 1. 基本过滤器 2. 内容过滤器 3. 可见性过滤器 4. 子元素过滤器 5. 其他方法 一.  基本过滤器 过滤器名 jQuery语法 注释 :f ...

  9. [转载]AngularJS入门教程04:双向绑定

    在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f ...

  10. python 线程even

    import threading,time import random def door(nums): num=1#电梯在一楼 while True: print("this door is ...