现在的位置: 首页 > 综合 > 正文

opencv中直方图

2013年08月13日 ⁄ 综合 ⁄ 共 5113字 ⁄ 字号 评论关闭

直方图



  CvHistogram

  多维直方图

     typedef struct CvHistogram

      {

            int header_size;

           CvHistType type;

           int flags; int c_dims;

           int dims[CV_HIST_MAX_DIM];

           int mdims[CV_HIST_MAX_DIM];

           float* thresh[CV_HIST_MAX_DIM];

           float* array;

           struct CvNode* root;

           CvSet* set;

           int* chdims[CV_HIST_MAX_DIM];

     } CvHistogram;



  CreateHist

  创建直方图

      CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1
);


  dims



  直方图维数的数目


  sizes


  直方图维数尺寸的数组


  type

  直方图的表示格式:

       CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND;

       CV_HIST_TREE 意味着直方图数据表示为多维稀疏数组CvSparseMat.



  ranges


  图中方块范围的数组. 它的内容取决于参数 uniform 的值。这个范围的用处是确定何时计算直方图或决定反向映射(backprojected ),每个方块对应于输入图像的哪个/哪组值。



  uniform

  归一化标识。

      如果不为0,则ranges[i](0<=i<cDims,译者注:cDims为直方图的维数,对于灰度图为1,彩色图为3)是包含两个元素的范围数组,包括直方图第i维的上界和下界。在第i维上的整个区域
[lower,upper]被分割成 dims[i] 个相等的块(译者注:dims[i]表示直方图第i维的块数),这些块用来确定输入象素的第 i 个值(译者注:对于彩色图像,i确定R, G,或者B)的对应的块;

      如果为0,则ranges[i]是包含dims[i]+1个元素的范围数组,包括lower0, upper0, lower1, upper1 == lower2, ..., upperdims[i]-1,
其中lowerj 和upperj分别是直方图第i维上第 j 个方块的上下界(针对输入象素的第 i 个值)。任何情况下,输入值如果超出了一个直方块所指定的范围外,都不会被 cvCalcHist 计数,而且会被函数cvCalcBackProject 置零。


  函数 cvCreateHist 创建一个指定尺寸的直方图,并且返回创建的直方图的指针。 如果数组的 ranges 是 0, 则直方块的范围必须由函数cvSetHistBinRanges 稍后指定。虽然
cvCalcHist 和 cvCalcBackProject 可以处理 8-比特图像而无需设置任何直方块的范围,但它们都被假设等分 0..255 之间的空间。


     
SetHistBinRanges



  设置直方块的区间 void cvSetHistBinRanges( CvHistogram* hist, float** ranges, int uniform=1 );



  hist 直方图. ranges


  直方块范围数组的数组,见 cvCreateHist. uniform


  归一化标识,见 cvCreateHist.

  函数 cvSetHistBinRanges 是一个独立的函数,完成直方块的区间设置。更多详细的关于参数 ranges 和 uniform 的描述,请参考函数 cvCalcHist , 该函数也可以初始化区间。直方块的区间的设置必须在计算直方图之前,或
在计算直方图的反射图之前。


     
ReleaseHist



  释放直方图结构 void cvReleaseHist( CvHistogram** hist );


  hist


  被释放的直方图结构的双指针.

  函数 cvReleaseHist 释放直方图 (头和数据). 指向直方图的指针被函数所清空。如果 *hist 指针已经为 NULL, 则函数不做任何事情。


     ClearHist



  清除直方图 void cvClearHist( CvHistogram* hist );


  hist 直方图.

  函数 cvClearHist 当直方图是稠密数组时将所有直方块设置为 0,当直方图是稀疏数组时,除去所有的直方块。


      MakeHistHeaderForArray


  从数组中创建直方图

      CvHistogram* cvMakeHistHeaderForArray( int dims, int* sizes, CvHistogram* hist, float*
data, float** ranges=NULL, int uniform=1 );



  dims


  直方图维数.


  sizes


  直方图维数尺寸的数组


  hist


  为函数所初始化的直方图头


  data


  用来存储直方块的数组


  ranges


  直方块范围,见 cvCreateHist. uniform


  归一化标识,见 cvCreateHist.

  函数 cvMakeHistHeaderForArray 初始化直方图,其中头和直方块为用户所分配。以后不需要调用 cvReleaseHist 只有稠密直方图可以采用这种方法,函数返回
hist.


      QueryHistValue_1D


  查询直方块的值

     #define cvQueryHistValue_1D( hist, idx0 ) cvGetReal1D( (hist)->bins, (idx0) )

     #define cvQueryHistValue_2D( hist, idx0, idx1 ) cvGetReal2D( (hist)->bins, (idx0), (idx1) )

     #define cvQueryHistValue_3D( hist, idx0, idx1, idx2 ) cvGetReal3D( (hist)->bins, (idx0), (idx1),
(idx2) )

     #define cvQueryHistValue_nD( hist, idx ) cvGetRealND( (hist)->bins, (idx) )



  hist 直方图


  idx0, idx1, idx2, idx3


  直方块的下标索引


  idx 下标数组

  宏 cvQueryHistValue_*D 返回 1D, 2D, 3D 或 N-D 直方图的指定直方块的值。对稀疏直方图,如果方块在直方图中不存在,函数返回 0, 而且不创建新的直方块。


    
GetHistValue_1D


     
返回直方块的指针
     
#define cvGetHistValue_1D( hist, idx0 ) ((float*)(cvPtr1D( (hist)->bins, (idx0), 0 ))
     
#define cvGetHistValue_2D( hist, idx0, idx1 ) ((float*)(cvPtr2D( (hist)->bins, (idx0), (idx1), 0 ))
     
#define cvGetHistValue_3D( hist, idx0, idx1, idx2 ) ((float*)(cvPtr3D( (hist)->bins, (idx0), (idx1), (idx2), 0 ))
     
#define cvGetHistValue_nD( hist, idx ) ((float*)(cvPtrND( (hist)->bins, (idx), 0 ))



  hist 直方图.


  idx0, idx1, idx2, idx3


  直方块的下标索引.


  idx 下标数组


  宏 cvGetHistValue_*D 返回 1D, 2D, 3D 或 N-D 直方图的指定直方块的指针。对稀疏直方图,函数创建一个新的直方块,且设置其为 0,除非它已经存在。


     
GetMinMaxHistValue



  发现最大和最小直方块
     
void cvGetMinMaxHistValue( const CvHistogram* hist, float* min_value, float* max_value, int* min_idx=NULL, int* max_idx=NULL );



  hist 直方图


  min_value


  直方图最小值的指针


  max_value


  直方图最大值的指针


  min_idx


  数组中最小坐标的指针


  max_idx


  数组中最大坐标的指针


  函数 cvGetMinMaxHistValue 发现最大和最小直方块以及它们的位置。任何输出变量都是可选的。在具有同样值几个极值中,返回具有最小下标索引(以字母排列顺序定)的那一个。

     
NormalizeHist


  归一化直方图 void cvNormalizeHist( CvHistogram* hist, double factor );


  hist


  直方图的指针.


  factor


  归一化因子


  函数 cvNormalizeHist 通过缩放来归一化直方块,使得所有块的和等于 factor.

    
     
ThreshHist



  对直方图取阈值 void cvThreshHist( CvHistogram* hist, double threshold );


  hist


  直方图的指针.


  threshold


  阈值大小


  函数 cvThreshHist 清除那些小于指定阈值得直方块

     
CompareHist



  比较两个稠密直方图 double cvCompareHist( const CvHistogram* hist1, const CvHistogram* hist2, int method );



  hist1


  第一个稠密直方图


  hist2


  第二个稠密直方图


  method


  比较方法,采用其中之一:


  CV_COMP_CORREL


  CV_COMP_CHISQR


  CV_COMP_INTERSECT


  函数 cvCompareHist 采用下面指定的方法比较两个稠密直方图(H1 表示第一个, H2 - 第二个):
          
相关 (method=CV_COMP_CORREL): d(H1,H2)=sumI(H'1(I)•H'2(I))/sqrt(sumI[H'1(I) 2]•sumI[H'2(I)2])
          
其中 H'k(I)=Hk(I)-1/N•sumJHk(J) (N=number of histogram bins) Chi-square(method=CV_COMP_CHISQR): d(H1,H2)=sumI[(H1(I)-H2(I))/(H1(I)+H2(I))]
          
交叉 (method=CV_COMP_INTERSECT): d(H1,H2)=sumImax(H1(I),H2(I))


  函数返回 d(H1,H2) 的值。 为了比较稀疏直方图或更一般的加权稀疏点集(译者注:直方图匹配是图像检索中的常用方法),考虑使用函数 cvCalcEMD 。


    
CopyHist


  拷贝直方图 void cvCopyHist( const CvHistogram* src, CvHistogram** dst );


  src


  输入的直方图


  dst


  输出的直方图指针


  函数 cvCopyHist 对直方图作拷贝。如果第二个直方图指针 *dst 是 NULL, 则创建一个与 src 同样大小的直方图。否则,两个直方图必须大小和类型一致。然后函数将输入的直方块的值复制到输出的直方图中,并且设置取值范围与 src 的一致。


     
CalcHist



  计算图像image(s) 的直方图 void cvCalcHist( IplImage** image, CvHistogram* hist, int accumulate=0, const CvArr* mask=NULL );



  image


  输入图像s (虽然也可以使用 CvMat** ).


  hist


  直方图指针


  accumulate


  累计标识。如果设置,则直方图在开始时不被清零。这个特征保证可以为多个图像计算一个单独的直方图,或者在线更新直方图。


  mask


  操作 mask, 确定输入图像的哪个象素被计数


  函数 cvCalcHist 计算单通道或多通道图像的直方图。 用来增加直方块的数组元素可从相应输入图像的同样位置提取。

抱歉!评论已关闭.