6

我在其中一个点,我需要比较两个images.can任何人,请帮助我做so..By方式的图像的屏幕截图的方法的项目工作比较图像软件。 我想检查,如果两个图像是相同的,包括图像中显示的数字和字母(软件截图)..Python代码在python

+0

当你说比较时,你是什么意思?你想看看它们是否相同?您是否在寻找关于如何在Python中执行此操作或者如何比较一般图像的细节? – 2012-08-05 20:58:32

+0

是的,我想比较一下,看它们是否相同,包括软件中显示的数字/字母 – stallion 2012-08-06 04:53:40

回答

6

有以下几个方面做适当的比较。

  • 首先是根均平方差#

要获取的两幅图像是如何相似的一个指标,你可以计算的根均方根(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])) 
  • 另一个是精确比较#

最快的方式确定两个图像具有完全相同的内容,以获得两个图像之间的差异,然后计算边界此图像中的非零区域框。如果图像相同,则差分图像中的所有像素都为零,并且边界框函数返回无。

import ImageChops 

def equal(im1, im2): 
    return ImageChops.difference(im1, im2).getbbox() is None 
1

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

6

我保持所谓pyssim一个Python库,它使用的Structured Similarity (SSIM)方法来比较两个图像。

它没有Python绑定,但perceptualdiff程序也是在比较两个图像真棒 - 而且速度相当快。

+0

是pyssim的一种模糊比较?如果图像中有一盒文字,盒子的位置与另一张图像的位置相同,但是文本略有不同?它会返回什么分数?它只考虑结构吗? – user299709 2014-08-03 21:51:33

+0

如果文本不同,它将有一个较低的分数。 – jterrace 2014-08-04 00:57:58