Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何衡量两幅图像之间的相似性?_Algorithm_Language Agnostic_Image_Image Processing - Fatal编程技术网

Algorithm 如何衡量两幅图像之间的相似性?

Algorithm 如何衡量两幅图像之间的相似性?,algorithm,language-agnostic,image,image-processing,Algorithm,Language Agnostic,Image,Image Processing,我想将一个应用程序(可能是网页)的屏幕截图与之前拍摄的屏幕截图进行比较,以确定应用程序是否正确显示自己。我不想进行精确的匹配比较,因为方面可能略有不同(对于Web应用程序,根据浏览器的不同,某些元素可能位于稍微不同的位置)。它应该给出屏幕截图的相似程度 是否有一个库/工具已经做到了这一点?您将如何实施它?好吧,我不想直接回答您的问题,但我看到了这种情况。微软最近推出了一个名为的工具,它的功能非常类似于确定大量图片中的重叠区域(可能具有不同的纵横比) 我想知道他们的博客上是否有可用的库或代码片段。

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


是否有一个库/工具已经做到了这一点?您将如何实施它?

好吧,我不想直接回答您的问题,但我看到了这种情况。微软最近推出了一个名为的工具,它的功能非常类似于确定大量图片中的重叠区域(可能具有不同的纵横比)

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

你需要这些。要确定两个图像之间的微小差异,可以很好地工作,并且很容易实现。不过,我不知道有什么可用的实现方法。

我想知道(我真的只是想把这个想法抛在脑后)是否可以通过从一幅图像中减去另一幅图像,然后将生成的图像压缩为gif的jpeg格式,并将文件大小作为相似性的衡量标准来得到某种东西

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


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

您可能会看到开源工具的代码,尽管它似乎是用perl编写的,所以我不能说解析有多容易

阅读我喜欢的FindImageDups页面,我发现有一个。这大概更容易理解


您似乎也可以使用。

来扩展Vaibhav的注释,是一个开源的“自动标题器”,应该对这个问题有一些了解。

好的,一个真正的基本使用方法可以检查每一个像素的颜色,并将其与第二张图像上相应的像素颜色进行比较——但这可能是一个非常非常缓慢的解决方案。

这完全取决于你有多聪明希望算法是正确的

例如,以下是一些问题:

  • 裁剪图像与未裁剪图像
  • 添加文本的图像与不添加文本的图像
  • 镜像图像
我见过的最简单的算法就是对每个图像执行以下步骤:

  • 缩放到较小的值,如64x64或32x32,忽略纵横比,使用组合缩放算法而不是最近的像素
  • 缩放颜色范围,使最暗的为黑色,最亮的为白色
  • 旋转并翻转图像,使最亮的颜色为左上角,然后右上角再暗一点,左下角再暗一点(当然要尽可能深)
  • 编辑组合缩放算法是这样一种算法:当将10个像素向下缩放为1时,将使用一个函数来完成此操作,该函数将所有10个像素的颜色合并为一个像素。可以使用诸如平均、均值或更复杂的算法(如双三次样条)来完成

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

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


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

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

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

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

    这种类型的匹配对缩放(直方图归一化后)和旋转/移位/移动等具有很强的适应性

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


    直方图可以直接生成(假设您可以访问像素值),但如果您不喜欢,该库是做这类工作的一个很好的资源。是一个powerpoint演示文稿,向您展示如何使用OpenCV创建直方图。

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


    看看这个开源图像搜索应用程序。它描述了几种图像相似性算法,其中三种来自MPEG-7标准:ScalableColor、ColorLayout、EdgeHistogram和Auto Color Correlogram。

    如果这是您偶尔会做的事情,不需要自动化,您可以在支持图层的图像编辑器中完成,例如Photoshop或Paint Shop Pro(也可能是GIMP或Paint.Net,