OpenCV统计应用-直方图比较

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 );
}

原始图片:





 

执行结果:

(1)RiverBank.jpg & DarkClouds.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

Output:
CV_COMP_CORREL : 1
CV_COMP_CHISQR : 0
CV_COMP_INTERSECT : 1
CV_COMP_BHATTACHARYYA : 0

(3)Black.jpg
& White.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距离


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和分析功能。图像缩放是OpenCV中常用的一种图像处理技术,它可以改变图像的尺寸大小。 直方图是一种统计图形,用于表示一组数据的变化情况。在图像处理中,直方图描述了图像中像素值的分布情况。基于直方图的算法可以用来比较图像之间的相似度。 图像缩放对直方图算法相似度的影响是显著的。当图像进行缩放时,像素值的分布发生变化,直方图也会相应地改变。因此,在缩放后的图像上计算的直方图与原图像的直方图将不再相同。 图像缩放会导致直方图的形状发生变化,进而影响直方图算法的相似度度量结果。在缩小图像尺寸的情况下,直方图的分布信息可能会损失,因此算法的相似度度量可能会有所下降。而在放大图像尺寸的情况下,直方图的形状可能会变得更加平滑,导致算法相似度度量结果可能较为接近。 为了解决图像缩放对直方图算法相似度的影响,可以考虑在进行缩放操作之前,对图像进行预处理。例如,可以进行直方图均衡化或直方图匹配等操作,使得图像的直方图分布更加平衡或与目标直方图更加相似。这样,在缩放后计算直方图相似度时,结果会更加准确和可靠。 总之,图像缩放对直方图算法相似度有一定的影响,需要在实际应用中综合考虑图像的特点和需求,进行适当的预处理和调整,以得到准确和可靠的相似度度量结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值