cvCompareHist(),
是比较两个统计直方图的分布,总共有四个方法,被定义如下:
#define CV_COMP_CORREL 0
#define CV_COMP_CHISQR 1
#define CV_COMP_INTERSECT 2
#define CV_COMP_BHATTACHARYYA 3
而这些方法分别为相关系数,卡方,交集法以及在做常态分布比对的Bhattacharyya距离,这些方法都是用来做统计直方图的相似度比较的方法,而且,都是根据统计学的概念,这边就简单的拿来用灰阶统计直方图来比较,而这部份的比较方式,是由图形的色彩结构来着手,下面就简单的用三种情况来分析它们距离比较的方式
直方图比较实作
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>
int HistogramBins = 256 ;
float HistogramRange1[ 2 ]={ 0 , 255 };
float *HistogramRange[ 1 ]={ & HistogramRange1[ 0 ]};
int main()
{
IplImage *Image1=cvLoadImage( "RiverBank.jpg" , 0 );
IplImage *Image2=cvLoadImage( "DarkClouds.jpg" , 0 );
CvHistogram *Histogram1=cvCreateHist( 1 , & HistogramBins,CV_HIST_ARRAY,HistogramRange);
CvHistogram *Histogram2=cvCreateHist( 1 , & HistogramBins,CV_HIST_ARRAY,HistogramRange);
cvCalcHist( & Image1,Histogram1);
cvCalcHist( & Image2,Histogram2);
cvNormalizeHist(Histogram1, 1 );
cvNormalizeHist(Histogram2, 1 );
printf( "CV_COMP_CORREL : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_CORREL));
printf( "CV_COMP_CHISQR : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_CHISQR));
printf( "CV_COMP_INTERSECT : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_INTERSECT));
printf( "CV_COMP_BHATTACHARYYA : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_BHATTACHARYYA));
cvNamedWindow( "Image1" , 1 );
cvNamedWindow( "Image2" , 1 );
cvShowImage( "Image1" ,Image1);
cvShowImage( "Image2" ,Image2);
cvWaitKey( 0 );
}
原始图片:
![](http://space.ednchina.com/Upload/2009/2/21/ba4d7423-d773-4927-a391-7472c51c33cf.jpg)
![](http://space.ednchina.com/Upload/2009/2/21/0e8dde0e-ca66-43ea-b4bf-1ff2920f471a.jpg)
![](http://space.ednchina.com/Upload/2009/2/21/91023bd3-d725-4e08-af5e-8be26bebe825.jpg)
执行结果:
(1)RiverBank.jpg & DarkClouds.jpg
![](http://space.ednchina.com/Upload/2009/2/21/43acd097-550f-4193-a522-6897317169fc.jpg)
Output:
CV_COMP_CORREL : -0.1407
CV_COMP_CHISQR : 0.6690
CV_COMP_INTERSECT : 0.4757
CV_COMP_BHATTACHARYYA : 0.4490
(2)RiverBank.jpg & RiverBank.jpg
![](http://space.ednchina.com/Upload/2009/2/21/7173d902-1a09-4ee9-b5b5-62f69efdf61d.jpg)
Output:
CV_COMP_CORREL : 1
CV_COMP_CHISQR : 0
CV_COMP_INTERSECT : 1
CV_COMP_BHATTACHARYYA : 0
(3)Black.jpg & White.jpg
![](http://space.ednchina.com/Upload/2009/2/21/290fe9d0-724c-457f-b684-407363374dfe.jpg)
Output:
CV_COMP_CORREL : 1
CV_COMP_CHISQR : 1
CV_COMP_INTERSECT : 0
CV_COMP_BHATTACHARYYA : 1
这边的直方图比较,则是将它们的统计直方图用cvNormalizeHist()正规化成1,在由正规化的统计分布来做直方图的比较,从上面的输出结果可以推测出,卡方法以及Bhattacharyya是数值越小图形越相似,而相关系数则是看图形的分布程度,因此第三个Black.jpg & White.jpg 所显示相关系数的结果才会是1,这边的图形比较用的是统计学的方法,而一般的比较方式还有欧几里德距离的方式,在这个cvCompareHist()的函式,也可以实作出多通道的多维度直方图比较,而且支持CV_HIST_ARRAY及CV_HIST_SPARSE这两种直方图数据结构的格式,而这些比对方法的相关公式如下
相关系数法
而它的公式推导如下
再来是卡方的方式
这边的卡方法跟一般的卡方检定不太一样,下面是一般适合度检定(Goodness of fit test)的公式
o为观察者次数,e为期望值次数
交集的方式就比较简单了,两个直方图取最小的做累加
再来就是常态分配比对的Bhattacharyya距离
#define CV_COMP_CORREL 0
#define CV_COMP_CHISQR 1
#define CV_COMP_INTERSECT 2
#define CV_COMP_BHATTACHARYYA 3
而这些方法分别为相关系数,卡方,交集法以及在做常态分布比对的Bhattacharyya距离,这些方法都是用来做统计直方图的相似度比较的方法,而且,都是根据统计学的概念,这边就简单的拿来用灰阶统计直方图来比较,而这部份的比较方式,是由图形的色彩结构来着手,下面就简单的用三种情况来分析它们距离比较的方式
直方图比较实作
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>
int HistogramBins = 256 ;
float HistogramRange1[ 2 ]={ 0 , 255 };
float *HistogramRange[ 1 ]={ & HistogramRange1[ 0 ]};
int main()
{
IplImage *Image1=cvLoadImage( "RiverBank.jpg" , 0 );
IplImage *Image2=cvLoadImage( "DarkClouds.jpg" , 0 );
CvHistogram *Histogram1=cvCreateHist( 1 , & HistogramBins,CV_HIST_ARRAY,HistogramRange);
CvHistogram *Histogram2=cvCreateHist( 1 , & HistogramBins,CV_HIST_ARRAY,HistogramRange);
cvCalcHist( & Image1,Histogram1);
cvCalcHist( & Image2,Histogram2);
cvNormalizeHist(Histogram1, 1 );
cvNormalizeHist(Histogram2, 1 );
printf( "CV_COMP_CORREL : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_CORREL));
printf( "CV_COMP_CHISQR : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_CHISQR));
printf( "CV_COMP_INTERSECT : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_INTERSECT));
printf( "CV_COMP_BHATTACHARYYA : %.4f\n" ,cvCompareHist(Histogram1,Histogram2,CV_COMP_BHATTACHARYYA));
cvNamedWindow( "Image1" , 1 );
cvNamedWindow( "Image2" , 1 );
cvShowImage( "Image1" ,Image1);
cvShowImage( "Image2" ,Image2);
cvWaitKey( 0 );
}
原始图片:
![](http://space.ednchina.com/Upload/2009/2/21/ba4d7423-d773-4927-a391-7472c51c33cf.jpg)
![](http://space.ednchina.com/Upload/2009/2/21/0e8dde0e-ca66-43ea-b4bf-1ff2920f471a.jpg)
![](http://space.ednchina.com/Upload/2009/2/21/52da830e-ab51-43cb-ba9d-ba68358a8a0e.jpg)
![](http://space.ednchina.com/Upload/2009/2/21/91023bd3-d725-4e08-af5e-8be26bebe825.jpg)
执行结果:
(1)RiverBank.jpg & DarkClouds.jpg
![](http://space.ednchina.com/Upload/2009/2/21/43acd097-550f-4193-a522-6897317169fc.jpg)
Output:
CV_COMP_CORREL : -0.1407
CV_COMP_CHISQR : 0.6690
CV_COMP_INTERSECT : 0.4757
CV_COMP_BHATTACHARYYA : 0.4490
(2)RiverBank.jpg & RiverBank.jpg
![](http://space.ednchina.com/Upload/2009/2/21/7173d902-1a09-4ee9-b5b5-62f69efdf61d.jpg)
Output:
CV_COMP_CORREL : 1
CV_COMP_CHISQR : 0
CV_COMP_INTERSECT : 1
CV_COMP_BHATTACHARYYA : 0
(3)Black.jpg & White.jpg
![](http://space.ednchina.com/Upload/2009/2/21/290fe9d0-724c-457f-b684-407363374dfe.jpg)
Output:
CV_COMP_CORREL : 1
CV_COMP_CHISQR : 1
CV_COMP_INTERSECT : 0
CV_COMP_BHATTACHARYYA : 1
这边的直方图比较,则是将它们的统计直方图用cvNormalizeHist()正规化成1,在由正规化的统计分布来做直方图的比较,从上面的输出结果可以推测出,卡方法以及Bhattacharyya是数值越小图形越相似,而相关系数则是看图形的分布程度,因此第三个Black.jpg & White.jpg 所显示相关系数的结果才会是1,这边的图形比较用的是统计学的方法,而一般的比较方式还有欧几里德距离的方式,在这个cvCompareHist()的函式,也可以实作出多通道的多维度直方图比较,而且支持CV_HIST_ARRAY及CV_HIST_SPARSE这两种直方图数据结构的格式,而这些比对方法的相关公式如下
相关系数法
![](http://space.ednchina.com/Upload/2009/2/21/533a937c-dd35-4ab4-b291-14da4a16c68c.jpg)
而它的公式推导如下
![](http://space.ednchina.com/Upload/2009/2/21/91997b83-d630-4220-a9ee-4cd70e0331ab.jpg)
再来是卡方的方式
![](http://space.ednchina.com/Upload/2009/2/21/5e1db79a-8a0c-4e4d-a0a6-d55c590ed1bf.jpg)
这边的卡方法跟一般的卡方检定不太一样,下面是一般适合度检定(Goodness of fit test)的公式
![](http://space.ednchina.com/Upload/2009/2/21/30a1cc1f-36a4-406e-aec2-6bd6cb04633b.jpg)
o为观察者次数,e为期望值次数
交集的方式就比较简单了,两个直方图取最小的做累加
![](http://space.ednchina.com/Upload/2009/2/21/7edbf28b-2774-4747-bc13-8ee2cdd4b215.jpg)
再来就是常态分配比对的Bhattacharyya距离
![](http://space.ednchina.com/Upload/2009/2/21/ca56d466-d497-4d81-bb32-4fd4e7eca9fc.jpg)