利用OpenCV的calcHist绘制灰度直方图、H-S直方图、BGR直方图和自定义直方图的源码及说明

来源:互联网 发布:装修公司半包猫腻知乎 编辑:程序博客网 时间:2024/04/30 04:22
要绘制直方图,最重要的三个函数是calcHist、line、和rectangle,下面分别进行介绍

calcHist函数:

calcHist函数的原型如下:

void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          OutputArray hist, int dims, const int* histSize,
                          const float** ranges, bool uniform=true, bool accumulate=false );

点此查看calcHist函数的官方解释!

const Mat* images:待计算直方图的图像源的指针,注意是指针,因为有可能包含多幅图

 int nimage:表示待计算图像源中图像的个数,一般情况下都取值为1,就算你要计算多幅,也可以一个个地算啊!如果是多幅,那么说明 images是一个数组撒!

const int* channels:表示要计算哪些通道的指针,注意是指针,因为通道数可能是多个。灰度图为0,HSV的H-S直方图为0和1,BGR为0,1,2(不过BGR图可以使用split分离三个通道,再分别计算,通常也是这样处理)

InputArray mask:掩码阵列,关于这个参数可以参看我写的博文http://blog.csdn.net/wenhao_ir/article/details/51120508

OutputArray hist:存储计算出的直方图数据

int dims:直方图的维度,单通道为1,H-S直方图为2,一维的就是一条线,二维的就是一个平面(即包含x,y两个维度)

const int* histSize:表示直方图横坐标的区间数的指针,注意也是指针,因为对于二维的直方图而言,有两个维度的变量区间

const float** ranges:表示直方图每一维变量的上下界,注意是指针的指针,因为每一维度的区间都是两个边界值,又有可能是多维,如果不明白我说的话,看H-S直方图源码就清楚了

bool uniform=true:表示直方图是否均匀的标志,什么叫是否均匀?我这里就不翻译译官方的文档的注释了。我就说下自己的理解。要理解这个,首先要知道histSize的含义,histSize就明表示咱们这个直方图的横坐标被划分为多少个区间。如果是均匀的,那么从下界到上界之间就被均匀划分为这么多个区间,如果是非均匀,就需要在ranges中给出各个区间的起点和终点,显然histSize个区间需要histSize+1个点。这里我要说明一下在均匀的情况下如果ranges中写了多个区间程序是怎么操作的?比如自定义直方图程序中的histSize[1]={256}; float hranges[6]={0, 60, 120, 160, 220, 255};具体是这样操作的:把256个区间平分5个大区间中,即每个区间51.2个小区间,然后这些每个大区间再分别被划为51.2个小区间。就是这回事!

bool accumulate=false :这个参数表示如果你之前计算过这个直方图,那么这个直方图再次计算时一开始需不需要清零,显然,如果不清零,那么再次计算时是一种更新。

line函数

这个函数就是利用两点确定一条直线的原理绘线,原型如下:

CV_EXPORTS_W void line(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& color,
                     int thickness=1, int lineType=8, int shift=0);

一看原型就什么都知道了,所以没必要多讲!

rectangle函数

rectangle的绘制过程可以参见博文:

另外有一点我需要特别强调一下 那就是用calcHist计算出来的255级灰度值总是0,关于这个问题,我专门写了篇博文,详见http://blog.csdn.net/wenhao_ir/article/details/51332416 如果以后你的程序中要用到255级灰度值,那么可以自己写一段程序计算255级的灰度值,这个程序实际上很容易完成,可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51332416

好,接下来上源码,明白了以上函数的使用之后,再来看这个源码就很容易了!所以我就不注释什么了~

源码中用到的图片的下载链接:http://pan.baidu.com/s/1kUEDw5x

首先是灰度直方图的源码

//OpenCV版本2.4.9  //交流QQ2487872782 2016-8-4注:很报歉,此代码目前不能公开发表在博客上,已经删除,希望大家能理解!  

其次是H-S直方图的源码

//OpenCV版本2.4.9  //交流QQ2487872782 2016-8-4注:很报歉,此代码目前不能公开发表在博客上,已经删除,希望大家能理解!  

再次是BGR直方图

//OpenCV版本2.4.9  //交流QQ2487872782 2016-8-4注:很报歉,此代码目前不能公开发表在博客上,已经删除,希望大家能理解!  

最后是自定义直方图

//OpenCV版本2.4.9  //交流QQ2487872782 2016-8-4注:很报歉,此代码目前不能公开发表在博客上,已经删除,希望大家能理解!  

运行结果依次如下图所示:





-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号2487872782

0 0