如何测量两个图像之间的相似度?[关闭]


94

我想将一个应用程序(可能是网页)的屏幕快照与先前获取的屏幕快照进行比较,以确定该应用程序是否正确显示了自己。我不希望进行完全匹配比较,因为方面可能略有不同(对于Web应用程序,取决于浏览器,某些元素可能位于稍有不同的位置)。它应该衡量屏幕截图的相似程度。

是否有已经执行此操作的库/工具?您将如何实施?


1
有这等类似的问题的一些很好的答案: stackoverflow.com/questions/75891/...
BLAK

1
而更多的在这里:stackoverflow.com/questions/189943/...
Anoyz

1
根据机器学习(特别是“深度学习”)的最新进展,该更新答案了。
jldupont

我的实验室需要太多解决这个问题,以及所使用的工作流程概述这里:douglasduhaime.com/posts/...
duhaime

Answers:


73

这完全取决于您希望算法的智能程度。

例如,这是一些问题:

  • 裁剪的图像与未裁剪的图像
  • 带有文字的图像与没有文字的图像
  • 镜像图像

我见过的最简单的算法就是对每个图像执行以下步骤:

  1. 缩放到较小的尺寸(例如64x64或32x32)而不考虑宽高比,请使用组合缩放算法而不是最近的像素
  2. 缩放颜色范围,以使最暗的为黑色,最亮的为白色
  3. 旋转并翻转图像,以使最大的颜色在左上角,然后右上角变暗,左下角变暗(当然要尽可能)

编辑一个结合缩放算法是一个比例10个像素降低到一个时候会使用一个函数,所有的10个像素,并将其组合的颜色到一个做到这一点。可以使用平均,均值算法或双三次样条曲线等更复杂的算法来完成。

然后计算两个图像之间逐像素的平均距离。

要在数据库中查找可能的匹配项,请将像素颜色存储为数据库中的各个列,对一堆像素进行索引(但不是全部,除非您使用非常小的图像),然后执行针对每个像素使用范围的查询像素值,即 小图像中像素在要查找的图像的-5到+5之间的每个图像。

这很容易实现,并且运行起来相当快,但是当然不能处理大多数高级差异。为此,您需要更高级的算法。


14
什么是“组合缩放算法”?
Gregg Lind

32

测量这种情况的“经典”方法是将图像分解为一定数量的标准部分(例如10x10网格),然后计算每个单元格内部的RGB值直方图并比较相应的直方图。首选这种类型的算法,因为它既简单,又不影响缩放和(小!)转换。


6
这是否不像对整个图像进行单个直方图操作一样,但是又具有无法灵活镜像和旋转的缺点?
dodgy_coder

来自两半图像的2个直方图将比整个1个直方图具有更好的匹配精度。尽管它有您提到的缺点,但这取决于您要解决的问题。
psycho brm

25

使用规格化的颜色直方图。(在此处阅读有关应用程序的部分),它们通常用于图像检索/匹配系统,并且是一种非常可靠,相对快速且易于实现的匹配图像的标准方法。

本质上,颜色直方图将捕获图像的颜色分布。然后可以将其与另一张图像进行比较,以查看颜色分布是否匹配。

这种匹配非常适合缩放(一旦对直方图进行归一化),旋转/移动/移动等。

避免逐像素比较,因为图像稍微旋转/移动可能会导致报告差异很大。

直方图很容易生成(假设您可以访问像素值),但是如果您不喜欢它,则OpenCV库是进行此类操作的理想资源。是一个PowerPoint演示文稿,向您展示如何使用OpenCV创建直方图。


14

像MPEG这样的视频编码算法不计算视频的每个帧之间的差异,以便它们仅可以编码增量吗?您可能会研究视频编码算法如何计算那些帧差异。

查看此开源图像搜索应用程序http://www.semanticmetadata.net/lire/。它描述了几种图像相似度算法,其中三种来自MPEG-7标准:ScalableColor,ColorLayout,EdgeHistogram和Auto Color Correlogram。


1
这不会在这里回答问题。问题不在于每个像素的像素比较。
沙2015年

@Kousha是的,但仍然是思考的有趣方向。
含义-

13

您可以使用的纯数学方法O(n^2),但是只有当您确定没有偏移量或类似的东西时,它才有用。(尽管如果您有一些具有均匀颜色的对象,它仍然可以很好地工作。)

无论如何,这个想法是计算两个矩阵的标准化点积。 C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2))

该公式实际上是矩阵之间的角度(余弦)的“余弦”。相似度越大(让我们说Pij=Qij),C将等于1,如果它们完全不同,就对每个i,j Qij = 1(避免零除法)说Pij = 255,然后对于size nxn,值越大n,我们将越接近零。得到。(通过粗略计算:)C=1/n^2



7

可以在这里找到红宝石溶液

从自述文件:

Phashion是围绕pHash库(“感知哈希”)的Ruby包装,可检测重复的和几乎重复的多媒体文件


5

如何测量两个图像之间的相似性完全取决于您要测量的内容,例如:对比度,亮度,模态,噪声...,然后选择最适合您的相似性度量。您可以从MAD(平均绝对差),MSD(均方差)中选择适合测量亮度的...也有CR(相关系数),可以很好地表示两个图像之间的相关性。您还可以从基于直方图的相似性度量(例如SDH(差异图像直方图的标准偏差))或多模态相似性度量(如MI(互信息)或NMI(标准化互信息))中进行选择。

由于这种相似性度量会花费大量时间,因此建议在对这些度量应用这些度量之前先缩小图像。


4

我想知道(我真的只是想把想法扔掉),是否可以通过从另一个图像中减去一个图像,然后将所得图像压缩为gif jpeg,并将文件大小设为相似度。

如果您有两个相同的图像,则会得到一个白色框,该框的压缩效果非常好。图像差异越大,代表的图像就越复杂,因此可压缩性越差。

可能不是理想的测试,并且可能比必要的测试慢得多,但是它可能是快速而肮脏的实现。


考虑旋转90度;图像仍然相似。
含义-


2

好吧,不要直接回答您的问题,但是我已经看到了这种情况。微软最近启动了一个名为PhotoSynth的工具,该工具的作用非常相似,可以确定大量图片(可能具有不同的长宽比)中的重叠区域。

我想知道他们的博客上是否有任何可用的库或代码段。


1
这项技术。已停产。
约瑟夫·罗森

2

为了进一步说明Vaibhav的观点hugin是一个开源的“自动缝合器”,应该对此问题有所了解。


2

有用于基于内容的图像检索的软件,该软件可以(部分地)满足您的需求。从项目站点链接了所有参考和解释,还有一本简短的教科书(Kindle):LIRE


1

在本教程之后,您可以使用Siamese Network查看两个图像是相似还是相异。本教程将相似的图像聚类,而您可以使用L2距离来测量两个图像的相似性。


0

如果您偶尔需要这样做并且不需要自动化,则可以在支持图层的图像编辑器中进行,例如Photoshop或Paint Shop Pro(可能也是GIMP或Paint.Net,但是我我不确定那些)。打开两个屏幕截图,然后将其中一个放在另一个之上。将图层混合模式更改为“差异”,两者之间的所有相同内容都会变为黑色。您可以四处移动顶层以最大程度地减少对齐差异。


另一个使这种类型的
差异变得


-1

好吧,真正使用的基本方法可以遍历每种像素颜色,并将其与第二张图像上的相应像素颜色进行比较-但这可能是一个非常慢的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.