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

我想比较一个应用程序(可能是一个网页)的屏幕截图与以前采取的截图,以确定应用程序是否正确显示本身。 我不想要一个完全匹配的比较,因为方面可能会略有不同(在一个Web应用程序的情况下,取决于浏览器,一些元素可能在稍微不同的位置)。 它应该给出一个截图有多相似的尺度。

有没有一个库/工具已经这样做? 你将如何实现它?

这完全取决于你想要algorithm有多聪明。

例如,这里有一些问题:

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

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

  1. 缩放到像64×64或32×32这样的小东西,不考虑宽高比,使用组合缩放algorithm而不是最近像素
  2. 缩放颜色范围,使最黑暗最亮的是白色
  3. 旋转和翻转的图像,使最薄的左上angular,然后右上angular下一个更深,左下angular是下一个更深(当然尽可能)

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

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

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

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

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

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

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

这种types的匹配是非常适合缩放(一旦直方图归一化),旋转/移位/移动等。

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

直方图可以直接生成自己的图像(假设你可以访问像素值),但是如果你不喜欢它, OpenCV库是做这种事情的好资源。 这里是一个幻灯片演示文稿,向您展示如何使用OpenCV创build直方图。

你可以使用一个纯粹的O(n^2)math方法,但是只有当你确定没有偏移量或类似的东西时才有用。 (虽然如果你有几个同色的物体,它仍然会工作的很好。)

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

这个公式实际上是matrix(奇怪的)之间angular度的“余弦”。 相似性越大(可以说Pij=Qij ),C将是1,如果它们完全不同,那么对于每个i,j Qij = 1 (避免零分割), Pij = 255 ,则对于尺寸nxn ,越大,越接近零,我们会得到。 (粗略计算: C=1/n^2 )。

不要像MPEG那样的video编码algorithm计算video的每一帧之间的差异,这样他们就可以对三angular洲进行编码了? 您可以查看video编码algorithm如何计算这些帧差异。

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

你需要模式识别 。 为了确定两幅图像之间的微小差异, Hopfieldnetworking工作得相当好,而且很容易实现。 但是我不知道任何可用的实现。

ruby解决scheme可以在这里find

自述文件:

Phashion是一个围绕pHash库的Ruby包装器,“知觉散列”(perceptual hash),用于检测重复和接近重复的多媒体文件

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

如果你有两个相同的图像,你会得到一个白色的盒子,这将非常好的压缩。 图像越不同,表示越复杂,因此可压缩性越差。

可能不是一个理想的testing,可能比必要的慢很多,但它可能作为一个快速和肮脏的实施。

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

由于这种相似性度量的时间成本太高,build议在对这些度量应用这些度量之前缩小图像的尺寸。

你可能会看到开源工具findimagedupes的代码,虽然它看起来是用Perl写的,所以我不能说它是多么容易parsing…

阅读我喜欢的findimagedupes页面,我看到有相同algorithm的C ++实现 。 大概这会更容易理解。

看来你也可以使用gqview 。

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

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

根据Vaibhav的说法 , hugin是一个开源的“autostitcher”,应该对这个问题有所了解。

有基于内容的图像检索软件,它(部分)你需要什么。 所有参考资料和解释都是从项目网站链接的,还有一个简短的教科书(Kindle): LIRE

那么一个真正的基础级的方法可以通过每一个像素的颜色,并将其与第二个图像上相应的像素颜色进行比较 – 但这可能是一个非常慢的解决scheme。

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

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

Beyond Compare比较了图像的逐像素比较,例如,

在这里输入图像描述