OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
直方图比较

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

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

目标

在本教程中,你将学习如何:

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

理论

  • 要比较两个直方图( \(H_{1}\) 和 \(H_{2}\) ),首先我们必须选择一个度量( \(d(H_{1}, H_{2})\) )来表示两个直方图的匹配程度。
  • OpenCV 实现了函数 cv::compareHist 来执行比较。它还提供了 6 种不同的度量来计算匹配度。
    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. 交集( 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)}}\]

    5. 替代卡方( cv::HISTCMP_CHISQR_ALT

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

    6. Kullback-Leibler 散度( cv::HISTCMP_KL_DIV

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

代码

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

解释

  • 加载基础图像 (src_base) 和其他两个测试图像

  • 将它们转换为 HSV 格式

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

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

  • 计算基础图像、2 个测试图像和下半部分基础图像的直方图。

  • 顺序应用 6 种比较方法,比较基础图像 (hist_base) 的直方图与其他直方图。

结果

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

其中第一个是基础图像(用于与其他图像进行比较),另外两个是测试图像。我们还将比较第一个图像与它自身以及与基础图像下半部分的比较。

  1. 我们期望将基础图像直方图与自身比较时得到完美匹配。此外,与基础图像下半部分的直方图相比,它应该呈现高度匹配,因为两者来自同一来源。对于其他两个测试图像,我们可以观察到它们具有非常不同的照明条件,因此匹配度应该不会很好。
  2. 以下是我们使用 OpenCV 4.12.0 获得的数值结果

    方法 基础 - 基础基础 - 一半基础 - 测试 1基础 - 测试 2
    相关性 1.000000 0.880438 0.20457 0.065752
    卡方 0.000000 0.328307 181.674 80.1494
    交集 1.000000 0.75005 0.315061 0.0908022
    巴塔查里亚 0.000000 0.237866 0.679825 0.873709
    卡方替代 0.000000 0.395046 2.31572 3.41024
    KL 散度 0.000000 0.321064 2.6616 9.55412

    对于 相关性交集 方法,度量值越高,匹配越准确。正如我们所见,基础-基础 的匹配度是所有方法中最高的,符合预期。我们还可以观察到 基础-一半 的匹配度是第二好的匹配(正如我们预测的那样)。对于其他四种度量,结果越小,匹配越好。