从 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 如何能把从摄像头中抓取的两帐图片进行精确比较?