OpenCV  4.10.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\) 是直方图条目的总数。
    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)}}\]

代码

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

说明

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

  • 将它们转换为 HSV 格式

  • 此外,创建一副基础图像一半大小的图像(HSV 格式)

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

  • 计算基础图像、2 幅测试图像以及一半基础图像的直方图

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

结果

  1. 我们使用以下图像作为输入: 其中第一幅是基础图像(与其他图像进行比较),其他两幅是测试图像。我们还将比较第一幅图像本身和基础图像的一半。
  2. 在我们比较基础图像直方图本身时,应该会看到完全匹配。此外,与基础图像一半的直方图相比,它也应该呈现出很高的匹配度,因为两者来自同一个源。对于其他两幅测试图像,我们可以看到它们具有非常不同的光照条件,因此匹配度不会很好
  3. 这是我们在 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
    对于相关性交集方法,度量值越高,匹配越准确。正如我们所见,base-base 匹配度最高,这一点符合预期。我们还可以看到,base-half 匹配度是第二好的匹配度(正如我们预测的那样)。对于其他两种度量,结果越低,匹配度越好。我们可以看到,测试 1 和测试 2 与基础的匹配度较差,这也在预料之中。