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

是否有库/工具已经可以做到这一点?你会如何实施它?

有帮助吗?

解决方案

这完全取决于您希望算法有多智能。

例如,有以下一些问题:

  • 裁剪后的图像对比未裁剪的图像
  • 添加文字的图像与添加文字的图像另一个没有
  • 镜像

最简单最简单的 算法 我所看到的只是对每个图像执行以下步骤:

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

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

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

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

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

其他提示

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

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

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

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

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

直方图很容易自己生成(假设您可以访问像素值),但如果您不喜欢它, 开放式计算机视觉 图书馆是做这类事情的一个很好的资源。 这里 是一个 Powerpoint 演示文稿,向您展示如何使用 OpenCV 创建直方图。

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

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

您可以使用纯数学方法 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).

你需要 模式识别 为了那个原因。为了确定两个图像之间的微小差异, 霍普菲尔德网 工作得相当好并且很容易实现。但我不知道任何可用的实现。

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

来自自述文件:

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

如何测量两个图像之间的相似性完全取决于您想要测量的内容,例如:对比度、亮度、模态、噪声......然后选择最适合您的相似性度量。您可以选择 疯狂的 (平均绝对差), 默沙东 (均方差)这对于测量亮度很有好处...还有可用 CR (相关系数)能够很好地表示两幅图像之间的相关性。您还可以从基于直方图的相似性度量中进行选择,例如 SDH (差异图像直方图的标准差)或多模态相似性度量,例如 心肌梗死 (互信息)或 国家管理研究所 (标准化互信息)。

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

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

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

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

您可以查看开源工具的代码 查找图像欺骗, ,虽然它似乎是用 perl 编写的,所以我不能说解析它有多容易......

阅读我喜欢的 findimagedupes 页面,我发现有一个 相同算法的C++实现. 。想必这样会更容易理解。

看来你也可以使用 谷歌浏览器.

好吧,不是直接回答你的问题,但我已经看到这种情况发生了。微软最近推出了一款名为 光合成器 它的作用与确定大量图片(可能具有不同的宽高比)中的重叠区域非常相似。

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

扩展 Vaibhav 的注释, 于金 是一个开源的“自动缝合器”,应该对这个问题有一些见解。

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

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

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

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

无可比拟 对图像进行逐像素比较,例如,

enter image description here

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top