如何测量两个图像之间的相似度?
我想将一个应用程序(可能是网页)的屏幕快照与先前获取的屏幕快照进行比较,以确定该应用程序是否正确显示了自己。我不希望进行完全匹配比较,因为方面可能略有不同(对于Web应用程序,取决于浏览器,某些元素可能位于稍有不同的位置)。它应该给出屏幕截图有多相似的度量。
是否有已经执行此操作的库/工具?我们将如何实施?
解决方案
回答
好吧,不要直接回答问题,但是我已经看到了这种情况。微软最近启动了一个名为PhotoSynth的工具,该工具的作用非常相似,可以确定大量图片(可能具有不同的长宽比)中的重叠区域。
我想知道他们的博客上是否有任何可用的库或者代码段。
回答
我们将需要模式识别。为了确定两个图像之间的细微差别,Hopfield网络工作得很好并且很容易实现。我不知道任何可用的实现。
回答
我想知道(我真的只是把想法丢掉了,可以击倒了)是否可以通过从另一个图像中减去一个图像,然后将生成的图像压缩为gif的jpeg,并将文件大小设为相似度。
如果我们有两个相同的图像,则会得到一个白色框,该框的压缩效果非常好。图像差异越大,代表的图像就越复杂,因此可压缩性越差。
可能不是理想的测试,并且可能比必要的测试慢得多,但是它可能是一种快速而肮脏的实现。
回答
我们可能会看一下开放源代码工具findimagedupes的代码,尽管它似乎是用perl编写的,所以我不能说它的解析有多么容易...
阅读我喜欢的findimagedupes页面,我发现有相同算法的C ++实现。大概这将更容易理解。
看来我们也可以使用gqview。
回答
为了进一步说明Vaibhav的观点,hugin是一个开源的"自动缝合器",应该对此问题有所了解。
回答
好吧,一个真正使用的基本方法可以遍历每种像素颜色,并将其与第二张图像上的相应像素颜色进行比较,但这可能是一个非常慢的解决方案。
回答
这完全取决于我们希望算法的智能程度。
例如,这是一些问题:
- 裁剪的图像与未裁剪的图像
- 带有文字的图像与没有文字的图像
- 镜像图像
我见过的最简单最简单的算法就是对每个图像执行以下步骤:
- 缩放到较小的尺寸(例如64x64或者32x32),而不考虑宽高比,请使用组合缩放算法而不是最近的像素
- 缩放颜色范围,以使最暗的为黑色,最亮的为白色
- 旋转并翻转图像,以使最亮的颜色在左上角,然后右上角变暗,左下角变暗(当然要尽可能)
编辑组合缩放算法是一种将10像素缩小到1的算法,该函数将使用所有这10个像素的颜色并将它们合并为一个的函数。可以使用平均,均值算法或者双三次样条曲线等更复杂的算法来完成。
然后计算两个图像之间逐像素的平均距离。
要在数据库中查找可能的匹配项,请将像素颜色存储为数据库中的各个列,对一堆像素进行索引(但不是全部索引,除非我们使用非常小的图像),然后执行针对每个像素使用范围的查询像素值,即小图像中像素在要查找的图像的-5到+5之间的每个图像。
这很容易实现,并且运行起来相当快,但是当然不能处理大多数高级差异。为此,我们需要更高级的算法。
回答
测量这种情况的"经典"方法是将图像分解为一定数量的标准部分(例如10x10网格),然后计算每个单元格内部的RGB值直方图并比较相应的直方图。首选这种类型的算法,因为它既简单,又不影响缩放和(小!)转换。
回答
使用规格化的颜色直方图。 (在此处阅读有关应用程序的部分),它们通常用于图像检索/匹配系统,并且是一种非常可靠,相对快速且易于实现的匹配图像的标准方法。
本质上,颜色直方图将捕获图像的颜色分布。然后可以将其与另一张图像进行比较,以查看颜色分布是否匹配。
这种匹配非常适合缩放(一旦对直方图进行归一化),旋转/移动/运动等。
避免逐像素比较,因为图像稍微旋转/移动可能会导致报告差异很大。
直方图很容易生成(假设我们可以访问像素值),但是如果我们不喜欢它,则OpenCV库是进行此类操作的理想资源。这是一个PowerPoint演示文稿,向我们展示如何使用OpenCV创建直方图。
回答
像MPEG这样的视频编码算法不计算视频的每个帧之间的差异,以便它们可以对增量进行编码吗?我们可能会研究视频编码算法如何计算那些帧差异。
查看此开源图像搜索应用程序http://www.semanticmetadata.net/lire/。它描述了几种图像相似度算法,其中三种来自MPEG-7标准:ScalableColor,ColorLayout,EdgeHistogram和Auto Color Correlogram。
回答
如果我们偶尔需要执行此操作并且不需要自动化,则可以在支持图层的图像编辑器中执行此操作,例如Photoshop或者Paint Shop Pro(也可能是GIMP或者Paint.Net,但是我我不确定那些)。打开两个屏幕截图,然后将其中一个作为图层放在另一个之上。将图层混合模式更改为"差异",两者之间的所有相同内容都会变为黑色。我们可以四处移动顶层以最大程度地减少对齐差异。