aihot  2017-04-30 10:36:36  OpenCV |   查看评论   

 OpenCV学习笔记(八)——图像处理之直方图ImgProc

直方图histograms也是图像处理中经常用到的一种手段。新版本对直方图不再使用之前的histogram的形式,而是用统一的Mat或者MatND的格式来存储直方图,可见新版本Mat数据结构的优势。先介绍下其相关的函数

calcHist、calcBackProject、compareHist、EMD、equalizeHist。除了这几个常用的函数以为,还有一些c函数写的直方图类CvHistogram的相关操作,如下:cvCalcBackProjectPatch、cvCalcProbDensity、cvClearHist、cvCopyHist、cvCreateHist、cvGetHistValue_XD、cvGetMinMaxHistValue、cvMakeHistHeaderForArray、cvNormalizeHist、QueryHistValue_XD、cvReleaseHist、cvSetHistBinRanges、cvThreshHist、cvCalcPGH

calcHist函数为计算图像的直方图,使用方法如下:

  1. // C++  
  2. void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=truebool accumulate=false )  
  3. // C++:   
  4. void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, SparseMat& hist, int dims, const int* histSize, const float** ranges, bool uniform=truebool accumulate=false )  

 

arrays为输入图像指针,narrays为输入图像的个数,channels为用来计算直方图的通道列表,mask为掩膜矩阵,不为空的时候,只计算arrays中的掩膜区域的直方图,hist为输出的直方图矩阵,dims为直方图矩阵的维度,histSize为每一维直方图矩阵的大小,ranges为每一维直方图元素的取值范围,是一个2维数组的地址,uniform为直方图是否为统一模式,统一模式下会拉伸为range的大小,accumulate为累计标志,方便直方图的更新,不需要重新计算

举几个实例方便大家理解:

对于图像为灰度图,调用方式如下:

  1. int histSize = 255;  
  2. float ranges[] = {0, 255};  
  3. const float* histRange = {ranges};  
  4. calcHist(&img, 1, 0, Mat(), hist, 1, &histSize, &histRange);  


直方图的归一化已经不再适合cvNormalizeHist这个函数了,只需要用对矩阵的归一化函数normalize就可以实现了。

直方图均衡化函数为equalizeHist,这个函数比较简单,这里就不详细介绍了

直方图的比较函数为compareHist,函数返回值为两矩阵的相似程度,相似度衡量的办法目前支持4种

– CV_COMP_CORREL Correlation相关系数,相同为1,相似度范围为[ 1, 0 )

– CV_COMP_CHISQR Chi-Square卡方,相同为0,相似度范围为[ 0, +inf )

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV学习笔记(八)——图像处理之直方图ImgProc

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]