【OpenCV基础】第二十三课:直方图比较

直方图比较,cv::compareHist

Posted by x-jeff on August 27, 2021

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.直方图比较方法

对输入的两张图像计算得到直方图$H_1$和$H_2$,归一化到相同的尺度空间,然后可以通过计算$H_1$与$H_2$之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。

OpenCV提供的比较方法有六种:

  1. HISTCMP_CORREL = 0
  2. HISTCMP_CHISQR = 1
  3. HISTCMP_INTERSECT = 2
  4. HISTCMP_BHATTACHARYYA = 3(等同于HISTCMP_HELLINGER
  5. HISTCMP_CHISQR_ALT = 4
  6. HISTCMP_KL_DIV = 5

1.1.HISTCMP_CORREL

即Correlation。公式为:

\[d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2 \sum_I(H_2(I) - \bar{H_2})^2}}\]

且有:

\[\bar{H_k} = \frac{1}{N} \sum _J H_k(J)\]

$N$为直方图中bin的个数(即组数)。$H_k(J)$表示第$k$个直方图的第$J$个bin的频次。

上述公式其实就是相关系数的计算公式,相关内容请参见:相关系数

1.2.HISTCMP_CHISQR

即Chi-Square。公式为:

\[d(H_1,H_2) = \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)}\]

1.3.HISTCMP_INTERSECT

即Intersection。公式为:

\[d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I))\]

1.4.HISTCMP_BHATTACHARYYA

即Bhattacharyya distance。实际上OpenCV计算的是Hellinger distance,这和Bhattacharyya系数是有关的。公式为:

\[d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}\]

1.5.HISTCMP_CHISQR_ALT

即Alternative Chi-Square。公式为:

\[d(H_1,H_2) = 2 * \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)+H_2(I)}\]

通常用于texture comparison。

1.6.HISTCMP_KL_DIV

即Kullback-Leibler divergence。公式为:

\[d(H_1,H_2) = \sum _I H_1(I) \log \left(\frac{H_1(I)}{H_2(I)}\right)\]

2.相关API

比较直方图的常用步骤如下:

  1. 把图像从RGB色彩空间转换到HSV色彩空间。
  2. 计算图像的直方图并归一化到0~1之间。
  3. 比较直方图。

比较直方图的API:

1
2
3
4
5
double compareHist( 
	InputArray H1, 
	InputArray H2, 
	int method 
);

3.代码地址

  1. 直方图比较