10

我需要比较两个作为软件屏幕截图的图像。我想检查两个图像是否相同,包括图像中显示的数字和字母。如何实现?

4

4 回答 4

12

有以下方法可以进行正确的比较。

  • 首先是均方根差 #

要衡量两个图像的相似程度,您可以计算图像之间差异的均方根 (RMS) 值。如果图像完全相同,则该值为零。下面的函数使用差分函数,然后从结果图像的直方图中计算 RMS 值。

# Example: File: imagediff.py

import ImageChops
import math, operator

def rmsdiff(im1, im2):
    "Calculate the root-mean-square difference between two images"

    h = ImageChops.difference(im1, im2).histogram()

    # calculate rms
    return math.sqrt(reduce(operator.add,
        map(lambda h, i: h*(i**2), h, range(256))
    ) / (float(im1.size[0]) * im1.size[1]))
  • 另一个是精确比较#

判断两幅图像内容是否完全相同的最快方法是获取两幅图像之间的差异,然后计算出这幅图像中非零区域的边界框。如果图像相同,则差异图像中的所有像素都为零,并且边界框函数返回 None。

import ImageChops

def equal(im1, im2):
    return ImageChops.difference(im1, im2).getbbox() is None
于 2012-08-05T17:04:46.173 回答
8

我正在维护一个名为pyssim的 Python 库,它使用结构化相似性 (SSIM)方法来比较两个图像。

它没有 python 绑定,但是perceptualdiff程序在比较两个图像方面也很棒——而且速度非常快。

于 2012-08-05T17:19:10.947 回答
1

我不能给出一个现成的答案,但我会指出(我认为)正确的方向。比较两个图像的一种简单方法是对它们的二进制表示进行散列,然后查看这些散列是否相同。这样做的一个问题是您要使用的散列函数,您必须寻找一个碰撞机会低的哈希函数,另一个是图像文件可能具有附加到原始二进制信息的元数据,因此您必须查看在如何切断该元数据以便仅使用它们的二进制信息比较图像。另外,我不确定,但可能以 jpg 编码的图像的二进制表示与以 png 编码的图像不同,因此您应该注意这一点。

于 2012-08-05T15:06:45.593 回答
1

对于任何偶然发现这一点并且接受的答案对他们不起作用的人,我将其发布在这里。

我有一个类似的场景,我需要将一张图像与其他数千张图像进行比较,然后找到最相似的一张。我最终开始使用 ImageChop 的差异函数并应用如下平均值:

import numpy as np

def calcdiff(im1, im2):
    dif = ImageChops.difference(im1, im2)
    return np.mean(np.array(dif))

通过将差异图像转换为数组,我可以计算平均差异。差异越小,图像与原始图像越接近。


注意:另一种接近完全相似的方法是将 转换ImageChops.difference(im1, im2)为 numpy 数组,然后从数组中减去完全匹配[0, 0, 0]的像素。然后通过计算len()数组的 ,我们获得一个分数,这使我们能够区分图像。最接近的是分数最低的那个

于 2021-11-26T19:31:25.603 回答