How can I measure the similarity between two images?我想比较一个应用程序(可能是一个网页)的屏幕截图与之前拍摄的屏幕截图,以确定应用程序是否正确显示自己。 我不想进行完全匹配比较,因为方面可能略有不同(在Web应用程序的情况下,取决于浏览器,某些元素可能位于稍微不同的位置)。 它应该衡量屏幕截图的相似程度。 是否有图书馆/工具已经做到了? 你会如何实现它? 这完全取决于您希望算法的智能程度。 例如,以下是一些问题:
我见过的最简单,最简单的算法就是对每个图像执行以下步骤: 编辑组合缩放算法是指将10个像素缩小到1时将使用一个函数来实现它,该函数采用所有这10个像素的颜色并将它们合并为一个。可以使用平均,平均值或更复杂的算法(如双三次样条)等算法来完成。 然后计算两个图像之间的逐个像素的平均距离。 要在数据库中查找可能的匹配项,请将像素颜色存储为数据库中的单个列,索引其中一组(但不是全部,除非您使用非常小的图像),并执行使用每个列的范围的查询像素值,即。每个图像,其中小图像中的像素位于要查找的图像的-5到+5之间。 这很容易实现,并且运行起来相当快,但当然不会处理大多数高级差异。为此,您需要更高级的算法。 测量这种情况的"经典"方法是将图像分解为一些规范数量的部分(例如10x10网格),然后计算每个单元格内RGB值的直方图并比较相应的直方图。这种类型的算法是优选的,因为它的简单性和它对缩放和(小!)转换的不变性。 使用标准化颜色直方图。 (阅读这里的应用程序部分),它们通常用于图像检索/匹配系统,是一种非常可靠,相对快速且易于实现的匹配图像的标准方法。 基本上,颜色直方图将捕获图像的颜色分布。然后可以将其与另一图像进行比较以查看颜色分布是否匹配。 这种类型的匹配非常适合缩放(一旦直方图被标准化),以及旋转/移位/移动等。 避免逐像素比较,就好像图像稍微旋转/移动一样,可能会导致报告的差异很大。 直方图可以直接生成自己(假设您可以访问像素值),但如果您不喜欢它,OpenCV库是执行此类内容的绝佳资源。这是一个powerpoint演示文稿,向您展示如何使用OpenCV创建直方图。 像MPEG这样的视频编码算法不会计算视频每帧之间的差异,因此它们只能对delta进行编码吗?您可以研究视频编码算法如何计算这些帧差异。 看看这个开源图像搜索应用程序http://www.semanticmetadata.net/lire/。它描述了几种图像相似度算法,其中三种来自MPEG-7标准:ScalableColor,ColorLayout,EdgeHistogram和Auto Color Correlogram。
您可以使用
无论如何,这个想法是计算两个矩阵的归一化点积。
这个公式实际上是矩阵之间角度的"余弦"(wierd)。 你需要模式识别。为了确定两个图像之间的微小差异,Hopfield网络工作得相当好,并且很容易实现。不过,我不知道任何可用的实现。 这里可以找到红宝石溶液 从自述文件: Phashion是一个围绕pHash库的Ruby包装器,"感知哈希",它可以检测重复和接近重复的多媒体文件 如何测量两个图像之间的相似性完全取决于您想要测量的内容,例如:对比度,亮度,模态,噪声......然后选择最适合您的相似度量。您可以选择MAD(平均绝对差值),MSD(均方差),它们有助于测量亮度......还有可用的CR(相关系数),它可以很好地表示两个图像之间的相关性。您还可以选择基于直方图的相似性度量,如SDH(差异图像直方图的标准偏差)或多模态相似性度量,如MI(互信息)或NMI(归一化互信息)。 由于这种相似性测量的成本很高,因此建议在对其应用这些测量之前缩小图像。 如果可以通过从另一个图像中减去一个图像,然后将生成的图像压缩为gpe的jpe,并将文件大小作为文件大小,我想知道(我真的只是把想法扔到那里被击落)相似性的度量。 如果你有两个相同的图像,你会得到一个白色的盒子,它会很好地压缩。图像越不同,表示的复杂程度越高,因此可压缩性越低。 可能不是一个理想的测试,可能比必要的慢得多,但它可能会作为一个快速和肮脏的实现。 您可以查看开源工具的代码 findimagedupes ,虽然它似乎是用perl编写的,所以我不能说解析会有多容易 阅读我喜欢的findimagedupes页面,我看到有一个相同算法的C ++实现。据推测,这将更容易理解。 看来你也可以使用 gqview 。 有基于内容的图像检索软件,可以(部分地)完成您的需要。所有参考和解释都与项目网站相关联,还有一本简短的教科书(Kindle):LIRE 好吧,不要直接回答你的问题,但我已经看到了这种情况。微软最近推出了一款名为PhotoSynth的工具,它可以做很多相似的事情,以确定大量图片中的重叠区域(可能具有不同的宽高比)。 我想知道他们的博客上是否有任何可用的库或代码片段。 为了扩展Vaibhav的说明,hugin是一个开源的"自动调节器",应该对这个问题有一些了解。 如果这是你偶尔会做的事情并且不需要自动化,你可以在支持图层的图像编辑器中完成,例如Photoshop或Paint Shop Pro(可能也是GIMP或Paint.Net,但我'我不确定那些)。打开两个屏幕截图,并将一个作为一个层放在另一个上面。将图层混合模式更改为差异,两者之间相同的所有内容将变为黑色。您可以移动顶层以最小化任何对齐差异。 Beyond Compare对图像进行逐像素比较,例如,
您可以使用Siamese Network查看本教程后两个图像是相似还是不相似。 本教程将对相似图像进行聚类,而您可以使用 一个真正的基础级方法可以使用每个像素颜色并将其与第二个图像上的相应像素颜色进行比较 - 但这可能是一个非常非常慢的解决方案。 |