我想比较一个应用程序(可能是一个网页)的屏幕截图与之前拍摄的屏幕截图,以确定应用程序是否正确显示自己.我不想进行完全匹配比较,因为方面可能略有不同(在Web应用程序的情况下,取决于浏览器,某些元素可能位于稍微不同的位置).它应该衡量屏幕截图的相似程度.
是否有图书馆/工具已经做到了?你会如何实现它?
这完全取决于您希望算法的智能程度.
例如,以下是一些问题:
裁剪图像与未裁剪图像
添加了文本的图像与没有添加的文本
镜像图像
我见过的最简单,最简单的算法就是对每个图像执行以下步骤:
缩放到小的东西,如64x64或32x32,忽略宽高比,使用组合缩放算法而不是最近的像素
缩放颜色范围,使最暗的颜色为黑色,最亮的颜色为白色
旋转并翻转图像,使最左边的颜色位于左上方,然后右上角是下一个较暗,左下角则是较暗(当然尽可能)
编辑一个结合缩放算法是一个缩放10个像素时下降到一个会使用一个函数,所有的10个像素的颜色和它们组合成一个做到这一点.可以使用平均,平均值或更复杂的算法(如双三次样条)等算法来完成.
然后计算两个图像之间的逐个像素的平均距离.
要在数据库中查找可能的匹配项,请将像素颜色存储为数据库中的单个列,索引其中一组(但不是全部,除非您使用非常小的图像),并执行使用每个列的范围的查询像素值,即.每个图像,其中小图像中的像素位于要查找的图像的-5到+5之间.
这很容易实现,并且运行起来相当快,但当然不会处理大多数高级差异.为此,您需要更高级的算法.
测量这种情况的"经典"方法是将图像分解为一些规范数量的部分(例如10x10网格),然后计算每个单元格内RGB值的直方图并比较相应的直方图.这种类型的算法是优选的,因为它的简单性和它对缩放和(小!)转换的不变性.
使用标准化颜色直方图.(阅读这里的应用程序部分),它们通常用于图像检索/匹配系统,是一种非常可靠,相对快速且易于实现的匹配图像的标准方法.
基本上,颜色直方图将捕获图像的颜色分布.然后可以将其与另一图像进行比较以查看颜色分布是否匹配.
这种类型的匹配非常适合缩放(一旦直方图被标准化),以及旋转/移位/移动等.
避免逐像素比较,就好像图像稍微旋转/移动一样,可能会导致报告的差异很大.
直方图可以直接生成自己(假设您可以访问像素值),但如果您不喜欢它,OpenCV库是执行此类内容的绝佳资源.这是一个powerpoint演示文稿,向您展示如何使用OpenCV创建直方图.
像MPEG这样的视频编码算法不会计算视频每帧之间的差异,因此它们只能对delta进行编码吗?您可以研究视频编码算法如何计算这些帧差异.
看看这个开源图像搜索应用程序http://www.semanticmetadata.net/lire/.它描述了几种图像相似度算法,其中三种来自MPEG-7标准:ScalableColor,ColorLayout,EdgeHistogram和Auto Color Correlogram.
您可以使用纯数学方法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
,然后对于大小nxn
,越大n
,我们就越接近于零得到.(通过粗略计算:) C=1/n^2
.
你需要模式识别.为了确定两个图像之间的微小差异,Hopfield网络工作得相当好,并且很容易实现.不过,我不知道任何可用的实现.
这里可以找到红宝石溶液
从自述文件:
Phashion是一个围绕pHash库的Ruby包装器,"感知哈希",它可以检测重复和接近重复的多媒体文件
如何衡量两幅图像之间的相似性,完全取决于你想测量,例如什么:对比度,亮度,情态,噪声......然后选择最合适的相似性度量有你.您可以选择MAD(平均绝对差值),MSD(均方差),它们有助于测量亮度......还有可用的CR(相关系数),它可以很好地表示两个图像之间的相关性.你也可以从如基于直方图相似措施选择SDH(差分图像直方图的标准偏差)或类似的多模态相似的措施MI(互信息)或NMI(归一化互信息).
由于这种相似性测量的成本很高,因此建议在对其应用这些测量之前缩小图像.