102

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

是否有已经这样做的库/工具?你将如何实施它?

4

17 回答 17

77

这完全取决于您希望算法有多聪明。

例如,这里有一些问题:

  • 裁剪图像与未裁剪图像
  • 添加文本的图像与未添加文本的图像
  • 镜像

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

  1. 缩放到小的东西,比如 64x64 或 32x32,忽略纵横比,使用组合缩放算法而不是最近像素
  2. 缩放颜色范围,使最暗的是黑色,最亮的是白色
  3. 旋转并翻转图像,使最浅的颜色在左上角,然后右上角下一个更暗,左下角下一个更暗(当然尽可能)

编辑组合缩放算法是一种当将 10 个像素缩小到 1 个时,将使用一个函数来获取所有这 10 个像素的颜色并将它们组合成一个。可以使用平均、平均值或更复杂的算法(例如双三次样条)来完成。

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

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

这很容易实现,运行起来也相当快,但当然不会处理最高级的差异。为此,您需要更高级的算法。

于 2008-08-25T13:53:36.627 回答
33

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

于 2008-08-25T19:18:41.980 回答
27

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

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

这种类型的匹配对缩放(一旦直方图标准化)和旋转/移动/移动等非常有弹性。

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

直方图很容易自己生成(假设您可以访问像素值),但如果您不喜欢它,OpenCV库是做这类事情的绝佳资源。是一个演示文稿,向您展示如何使用 OpenCV 创建直方图。

于 2008-08-27T16:41:32.277 回答
14

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

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

于 2008-09-16T20:29:32.093 回答
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

于 2011-07-23T14:55:47.413 回答
8

为此,您需要模式识别。为了确定两个图像之间的微小差异,Hopfield 网络工作得很好并且很容易实现。不过,我不知道任何可用的实现。

于 2008-08-25T13:00:13.137 回答
7

可以在此处找到红宝石解决方案

从自述文件:

Pashion 是 pHash 库“感知哈希”的 Ruby 包装器,它检测重复和接近重复的多媒体文件

于 2011-09-22T20:51:06.927 回答
6

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

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

于 2016-01-31T10:41:24.737 回答
4

我想知道(我真的只是把这个想法扔在那里被击落)是否可以通过从另一个图像中减去一个图像来得出某些东西,然后将生成的图像压缩为 gif 的 jpeg,并将文件大小作为相似度的度量。

如果你有两个相同的图像,你会得到一个白色的盒子,它可以很好地压缩。图像差异越大,表示就越复杂,因此可压缩性就越小。

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

于 2008-08-25T13:04:38.540 回答
3

您可能会查看开源工具findimagedupes的代码,尽管它似乎是用 perl 编写的,所以我不能说解析起来有多容易......

阅读我喜欢的 findimagedupes 页面,我看到有一个C++ implementation of the same algorithm。想必这会更容易理解。

看来您也可以使用gqview

于 2008-08-25T13:09:06.517 回答
2

好吧,不要直接回答你的问题,但我已经看到了这种情况。微软最近推出了一个名为PhotoSynth的工具,它可以做一些非常相似的事情来确定大量图片(可能具有不同的纵横比)中的重叠区域。

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

于 2008-08-25T12:57:21.163 回答
2

扩展 Vaibhav 的说明,hugin是一个开源的“自动缝合器”,应该对这个问题有一些了解。

于 2008-08-25T13:16:33.817 回答
2

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

于 2013-04-19T14:51:44.833 回答
1

您可以按照本教程使用 Siamese Network 查看这两个图像是否相似。本教程将相似的图像聚类,而您可以使用L2距离来衡量两个图像的相似性。

于 2017-02-27T08:53:25.870 回答
1

Beyond Compare对图像进行逐像素比较,例如,

在此处输入图像描述

于 2017-04-26T19:57:11.387 回答
0

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

于 2008-10-15T15:15:47.650 回答
-1

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

于 2008-08-25T13:19:39.317 回答