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