如何测量两幅图像之间的相似度?

时间:2008-08-25 12:51:49

标签: algorithm language-agnostic image image-processing

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

是否有库/工具已经这样做了?你会如何实现它?

17 个答案:

答案 0 :(得分:64)

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

例如,以下是一些问题:

  • 裁剪图像与未裁剪图像
  • 添加了文字的图片与没有
  • 的其他图片
  • 镜像

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

  1. 缩放到小的东西,比如64x64或32x32,忽略宽高比,使用组合缩放算法而不是最近的像素
  2. 缩放颜色范围,使最暗的颜色为黑色,最亮的是白色
  3. 旋转并翻转图像,使最左边的颜色位于左上方,然后右上角显示较暗,左下方则显示较暗(当然尽量)
  4. 编辑 组合缩放算法是将10个像素缩小为1时将使用获取所有这10个像素的颜色的函数并将它们组合的算法合而为一。可以使用平均值,平均值或更复杂的算法(如双三次样条)来完成。

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

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

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

答案 1 :(得分:30)

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

答案 2 :(得分:25)

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

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

这种类型的匹配非常适合缩放(一旦直方图被标准化),以及旋转/移位/移动等。

避免逐像素比较,就好像图像被轻微旋转/移动一样,可能会导致报告的差异很大。

直方图可以直接生成(假设您可以访问像素值),但如果您不喜欢它,OpenCV库是执行此类内容的绝佳资源。 Here是一个powerpoint演示文稿,向您展示如何使用OpenCV创建直方图。

答案 3 :(得分:13)

你可以使用O(n^2)的纯数学方法,但只有当你确定没有偏移或类似的东西时它才会有用。 (虽然如果你有一些具有均匀着色的物体,它仍然可以很好地工作。)

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

这个公式实际上是矩阵之间角度的“余弦”(wierd)。 相似性越大(比方说Pij=Qij),C就会为1,如果它们完全不同,那就说每个i,j Qij = 1(避免零分割),Pij = 255,然后对于尺寸nxnn越大,我们就会越接近零。 (通过粗略计算:C=1/n^2)。

答案 4 :(得分:13)

像MPEG这样的视频编码算法是否计算出视频的每一帧之间的差异,以便它们只能对delta进行编码?您可以研究视频编码算法如何计算这些帧差异。

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

答案 5 :(得分:8)

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

答案 6 :(得分:7)

红宝石溶液可以是found here

自述文件:

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

答案 7 :(得分:5)

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

由于这种相似性测量的成本很高,因此建议在对这些测量应用这些测量之前缩小图像。

答案 8 :(得分:4)

我想(如果可以通过从另一个图像中减去一个图像,然后将生成的图像压缩为gpe的jpeg,并且将文件大小作为相似性的度量。

如果你有两个相同的图像,你会得到一个白色的盒子,它可以很好地压缩。图像越不同,表示的复杂程度越高,因此压缩程度越低。

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

答案 9 :(得分:3)

您可能会看一下开源工具findimagedupes的代码,虽然它似乎是用perl编写的,所以我不能说解析它是多么容易......

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

看来你也可以使用gqview

答案 10 :(得分:2)

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

答案 11 :(得分:2)

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

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

答案 12 :(得分:2)

有基于内容的图像检索软件,可以(部分地)完成您的需要。所有参考和解释都与项目网站相关联,还有一本简短的教科书(Kindle):LIRE

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

enter image description here