从 OpenCv 图像比较中获取比较分数

Posted

技术标签:

【中文标题】从 OpenCv 图像比较中获取比较分数【英文标题】:Getting comparison score from OpenCv image comparison 【发布时间】:2020-01-16 13:52:08 【问题描述】:

我正在尝试在 OpenCv 中编写一个函数来比较两个图像 - imageA 和 imageB,以检查它们的相似程度。

我想得出三个比较分数(0 到 100 值),如下所示。 1. 直方图 - compareHist() : OpenCV 方法 2. 模板匹配 - matchTemplate() : OpenCV 方法 3. 特征匹配 - BFMatcher() : OpenCV 方法

关于上述计算得出的分数,我想得出一个关于匹配的结论。 我成功地让这个功能工作,但没有得到它的比较分数。如果有人可以帮助我,我会很棒。此外,也欢迎有关此类图像匹配的任何其他建议。

我知道有不同种类的算法可用于上述功能。所以,只是澄清我将使用的图像类型。 1. 如上所述,这将是一对一的比较。 2. 它的所有图像都是由人类使用移动相机拍摄的。 3.匹配的图像将主要从同一地点拍摄同一物体/地点。 (根据一天中的时间,照明可能会有所不同) 4. 如果图像不匹配,用户将被要求点击另一个,直到匹配。 5. 比较的图片种类可以包括-走廊、办公桌、电脑屏幕(屏幕上要比较的内容)、胡椒文件等。

【问题讨论】:

你看过detect and visualize differences between two images with OpenCV Python吗?一种方法是使用 SSIM,它返回一个差异掩码和一个分数,您可以使用它来确定两个图像之间的相似度 发布您的代码,以防止在除您感兴趣的方向之外的所有方向编写代码。因此,无需重新发明*** ;-) 此外,发布也适用于“但不能获得比较分数”的代码部分。最重要的是添加语言特异性...... C++、C# 还是 Python? 【参考方案1】:

1- 使用直方图,您可以使用直方图交集获得比较分数。如果你将两个直方图的交集除以两个直方图的并集,会给你一个介于0之间的分数(根本不匹配)和 1 (完全匹配)如下图中的示例:

您可以使用简单的 For 循环计算直方图的交集。

2- 在模板匹配中,每种比较方法得到的分数都不同。在这个link 你可以看到每个方法的细节。在某些方法中,最高分意味着最佳匹配,但在另一些方法中,最低分意味着最匹配。为了定义一个介于 0 和 1 之间的分数,您应该考虑 2 个分数:一个用于将图像与其自身匹配(最匹配分数),另一个用于匹配两个完全不同的图像(最低匹配),然后 normalize按图像中的像素数得分(height*width)。

3- 特征匹配不同于最后两种方法。您可能有两个相似的图像,但特征很差(匹配失败),或者有两个概念上不同的图像并且有很多匹配的特征。尽管如果图像功能丰富,我们可以将某些内容定义为分数。为此,请考虑以下示例:

Img1 有 200 个特征 Img2 有 170 个特征 这两张图片有 100 个匹配的特征 将 0.5 (100/200) 视为整幅图像匹配分数

您还可以将匹配的特征对之间的距离纳入评分,但我认为这就足够了。

【讨论】:

【参考方案2】:

关于比较分数。您是否尝试过实施加权平均以获得最终的比较指标?根据准确性对您正在实施的 3 种匹配方法进行加权,最佳方法获得“最重”的权重。

另外,如果您想探索其他匹配方法,请尝试基于 FFT 的匹配:http://machineawakening.blogspot.com/2015/12/fft-based-cosine-similarity-for-fast.html

【讨论】:

以上是关于从 OpenCv 图像比较中获取比较分数的主要内容,如果未能解决你的问题,请参考以下文章

图像的 OpenCV Line-Mod 问题

opencv 如何能把从摄像头中抓取的两帐图片进行精确比较?

S0.2 灰度图

如何使用opencv比较存储在文件中的两个图像

RGB 图像中最主要的颜色 - OpenCV / NumPy / Python

Android中的OpenCV图像比较