OpenCV 4.12.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)}}\]

代码

  • 此程序的作用是什么?
    • 加载一张基础图像和两张测试图像,用于与基础图像进行比较。
    • 生成一张图像,它是基础图像的下半部分。
    • 将图像转换为 HSV 格式
    • 计算所有图像的 H-S 直方图,并对其进行归一化以便比较。
    • 比较基础图像的直方图与两张测试图像的直方图、基础图像下半部分的直方图以及基础图像自身的直方图。
    • 显示获得的数值匹配参数。

解释

  • 加载基础图像 (src_base) 和另外两张测试图像

  • 将它们转换为 HSV 格式

  • 此外,创建一个基础图像的下半部分图像(HSV 格式)

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

  • 计算基础图像、两张测试图像和基础图像下半部分的直方图

  • 依次应用 4 种比较方法,比较基础图像 (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 与基础图像的匹配度较差,这也符合预期。