OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
直方图比较

上一篇教程: 直方图计算
下一篇教程: 反向投影

原作者Ana Huamán
兼容性OpenCV >= 3.0

目标

本教程将教你如何

  • 使用函数 cv::compareHist 获取一个数值参数,该参数表示两个直方图匹配程度。
  • 使用不同的度量方法来比较直方图

理论

  • 为了比较两个直方图(\(H_{1}\) 和 \(H_{2}\)),我们首先必须选择一个度量(\(d(H_{1}, H_{2})\))来表示两个直方图匹配的程度。
  • OpenCV 实现了一个函数 cv::compareHist 来进行比较。它还提供了 4 种不同的度量方法来计算匹配程度。
    1. 相关性 ( cv::HISTCMP_CORREL )

      \[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 数。
    2. 卡方 ( cv::HISTCMP_CHISQR )

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

    3. 相交 (method=cv::HISTCMP_INTERSECT )

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

    4. 巴氏距离 ( cv::HISTCMP_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)}}\]

代码

  • 这段程序的功能是什么?
    • 加载一个基准图像和 2 个要与其进行比较的测试图像
    • 生成一个图像,它是基准图像的下半部分。
    • 将图像转换为 HSV 格式。
    • 计算所有图像的 H-S 直方图并对其进行归一化,以便进行比较。
    • 基准图像的直方图与 2 个测试直方图、基准图像下半部分的直方图以及相同的基准图像直方图进行比较。
    • 显示获得的数值匹配参数。

说明

  • 加载基准图像 (src_base) 和另外两个测试图像

  • 将它们转换为 HSV 格式

  • 此外,创建一个基准图像的一半大小的图像(使用 HSV 格式)。

  • 初始化计算直方图的参数(bin、范围和 H 和 S 通道)。

  • 计算基准图像、两个测试图像和基准图像一半大小图像的直方图。

  • 依次应用四种比较方法,比较基准图像(hist_base)的直方图和其他直方图。

结果

  1. 我们使用以下图像作为输入:

其中第一个是基准图像(与其他图像进行比较),另外两个是测试图像。我们还将比较第一张图像与其自身以及基准图像的一半。

  1. 我们将基准图像直方图与其自身进行比较时,应该预期得到完全匹配的结果。同样,与基准图像一半的直方图相比,也应该呈现高度匹配,因为两者都来自同一来源。对于另外两张测试图像,我们可以观察到它们的照明条件差异很大,因此匹配度应该不高。
  2. 以下是我们使用OpenCV 3.4.1获得的数值结果:
    方法 基准 - 基准基准 - 半图基准 - 测试1基准 - 测试2
    相关性 1.000000 0.880438 0.20457 0.0664547
    卡方 0.000000 4.6834 2697.98 4763.8
    交集 18.8947 13.022 5.44085 2.58173
    巴氏距离 0.000000 0.237887 0.679826 0.874173
    对于相关性交集方法,指标越高,匹配越准确。正如我们所看到的,正如预期的那样,“基准-基准”匹配是所有匹配中最高的。我们还可以观察到,“基准-半图”匹配是第二好的匹配(正如我们预测的那样)。对于其他两个指标,结果越小,匹配越好。我们可以观察到,测试1和测试2与基准的匹配度较差,这也在意料之中。