2008-08-25 204 views
77

我想比较一个应用程序(可能是一个网页)的屏幕截图与以前拍摄的截图,以确定应用程序是否正确显示其本身。我不希望进行完全匹配比较,因为方面可能略有不同(对于Web应用程序,取决于浏览器,某些元素可能位于稍微不同的位置)。它应该给出屏幕截图有多相似的度量。如何测量两个图像之间的相似度?

有没有图书馆/工具已经这样做?你将如何实现它?

+1

有这等类似的问题的一些很好的答案: http://stackoverflow.com/questions/75891/算法寻找类似图像 – blak 2012-07-02 20:16:10

+1

和更多在这里:http://stackoverflow.com/questions/189943/how-can-i-quantify-difference-between-two-images – Anoyz 2015-06-09 11:35:23

+0

根据近期更新答案的时间机器学习方面的进步,更具体地说是“深度学习”。 – jldupont 2016-07-21 14:19:19

回答

61

这完全取决于你想要算法的智能程度。

例如,这里有一些问题:

  • 裁剪的图像与一个未裁剪图像
  • 图像与文本添加与另一个不
  • 镜像图像

最简单和最简单的算法我已经看到了这只是做以下步骤,在每个图像:

  1. 规模小东西,像64×64或32x32,无视宽高比,请使用组合缩放算法而不是最近像素
  2. 缩放颜色范围,以使最暗的颜色变为黑色,最亮的是白色
  3. 旋转并且使得lighest颜色是左上,然后右上接下来更暗,左下是下一较粗翻转图像(尽可能当然)

编辑组合缩放算法是一种在将10个像素缩小到1个像素时将使用将所有这10个像素的颜色合并为一个的函数来执行此操作的算法。可以用像平均值,平均值或更复杂的算法(如双三次样条)来完成。

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

要在数据库中查找可能的匹配项,请将像素颜色作为单个列存储在数据库中,为其中一堆(但不是全部,除非使用非常小的图像)编制索引并执行查询每个像素值的范围,即。每幅图像中小图像中的像素在要查找的图像的-5和+5之间。

这很容易实现,运行速度相当快,但当然不会处理最高级的差异。为此你需要更先进的算法。

2

那么,不要直接回答你的问题,但我已经看到了这种情况。微软最近推出了一款名为PhotoSynth的工具,它可以做很多类似的工作,以确定大量图片中的重叠区域(可能具有不同的纵横比)。

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

+0

这项技术。已经停产。 – 2017-04-11 20:17:16

8

你需要pattern recognition。为了确定两幅图像之间的小差异,Hopfield nets工作得很好,而且很容易实现。不过,我不知道任何可用的实现。

4

我想知道如果可以通过从另一个图像中减去一个图像来获得某些东西,然后将得到的图像压缩为jpeg gif,文件大小作为相似度的度量。

如果你有两个相同的图片,你会得到一个白框,这将压缩真的很好。图像越不同,代表的图像越复杂,因此可压缩性越差。

可能不是一个理想的测试,而且可能比需要的慢得多,但它可能工作作为一个快速和肮脏的实现。

3

你可能看的开源工具findimagedupes的代码,但它似乎在Perl被写,所以我不能说这将是多么容易解析...

读findimagedupes我喜欢的页面,我看到有一个C++ implementation of the same algorithm。据推测这将更容易理解。

,看来你也可以使用gqview

+0

PixiePlus链接带我到一个网站让我知道:“Superdrol是高效类固醇”:D – 2017-05-06 00:51:43

2

对Vaibhav的注扩大,hugin是一个开源的“autostitcher”,这应该对这个问题的一些见解。

0

那么一个真正的基础级别的使用方法可以检查每个像素的颜色并将其与第二个图像上相应的像素颜色进行比较 - 但这可能是一个非常缓慢的解决方案。

27

测量这种方法的“经典”方法是将图像分解成一些规范数量的节(比如10x10网格),然后计算每个单元格内RGB值的直方图并比较相应的直方图。这种类型的算法因其简单性和对缩放和(小!)平移的不变性而被优选。

20

使用归一化的颜色直方图。 (阅读应用here的章节),它们通常用于图像检索/匹配系统,是匹配图像的标准方式,非常可靠,相对快速并且非常容易实现。

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

这种类型的匹配的相当resiliant缩放(一旦直方图是归一化),和旋转/移位/移动等

避免像素的逐像素比较仿佛图像旋转/略微错开它可能会导致一个很大的差异被报道。

直方图可以直接生成自己(假设你可以访问像素值),但如果你不喜欢它,OpenCV库是做这类东西的好资源。 Here是一个powerpoint演示文稿,向您展示如何使用OpenCV创建直方图。

11

不要像MPEG这样的视频编码算法计算视频的每个帧之间的差异,以便他们可以对delta编码进行编码?您可以研究视频编码算法如何计算这些帧差异。

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

0

如果这是您偶尔会做的事情,并且不需要自动化,您可以在支持图层的图像编辑器(例如Photoshop或Paint Shop Pro)(可能是GIMP或Paint.Net)中执行此操作,但我不确定这些)。打开两个屏幕截图,并将其中一个作为一个图层。将图层混合模式更改为差异,两者之间的所有内容都将变为黑色。您可以移动顶层以最小化任何对齐差异。

12

您可以使用纯粹的数学方法O(n^2),但只有在确定没有偏移或类似情况时才有用。 (尽管如果你有几个具有均匀着色的物体,它仍然可以很好地工作。)

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

该公式实际上是矩阵(奇怪)之间角度的“余弦”。 相似度越大(可以说Pij=Qij),C将为1,如果它们完全不同,则假定每i,j Qij = 1(避免零分),Pij = 255,则对于大小nxn,则更大的n将是更接近零,我们会得到。 (粗略计算:C=1/n^2)。

5

红宝石解决方案可以found here

自述:

Phashion围绕pHash库一个Ruby包装,“知觉哈希”,检测重复和近似重复的多媒体文件

2

有用于基于内容的图像检索的软件,它可以(部分)满足您的需求。所有参考文献和解释都链接到项目网站,并且还有一个简短的教科书(Kindle):LIRE

3

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

由于这种相似性措施的成本很高,建议在对这些措施应用这些措施之前对图像进行缩放。

0

您可以使用Siamese Network查看这两个图像是否相似或不相似,请看tutorial。本教程对相似图像进行聚类,而您可以使用L2距离来测量两幅图像的相似度。

相关问题