2017-08-08 5 views
0

私は、定期的にいくつかの事前定義された画像の1つを含む画面の特定の領域のスクリーンショットを取るpyscreenshotを使用して、Pythonでプログラムを作成しました。私はこれらの画像をファイルからリストに読み込み、スクリーンショットと比較して現在表示されているものを見たいと考えています。彼らは画面上にあったとして、最初のファイルは、画像をscreenshottingによって作成された:私はそれらを比較しようとするとpyscreenshotで撮影したスクリーンショットと保存したスクリーンショットを比較するにはどうすればよいですか?

while True: 

filenm = str(i) + ".png" 
im=ImageGrab.grab(bbox=(680,640,735,690)) #accross, down 
im.save(filenm) 
time.sleep(1) 
i = i + 1 

は、その後、それは常にfalseを報告します。

image2 = Image.open("04.png") 

im=ImageGrab.grab(bbox=(680,640,735,690)) #accross, down 

if im == image2: 
    print "TRUE" 
else: 
    print "FALSE" 

ただし、ファイルに保存した画像のうちの2つを比較します作品:

image = Image.open("03.png") 
image2 = Image.open("04.png") 

if image == image2: 
    print "TRUE" 
else: 
    print "FALSE" 

は、だから私の質問はどのように画像が一度ファイルからロード異なりますされ、どのように私は、ファイルからロードされたイメージで「ライブ」のスクリーンショットを比較することができますか?

答えて

0

を使用すると、PIL.Image.Imageオブジェクトが作成されたように見えます。ここで、Image.open()PIL.pngImagePlugin.PngImageFileオブジェクトを作成します。これらの2つのオブジェクトタイプを比較してPILイメージ用に特別なセマンティクスを実装していないため、メモリ内の同じオブジェクトであるかどうかをチェックするだけなので、実際のオブジェクトに対して==を呼び出すことは望ましくありません。コードは、私はnp.array()でndarraysをnumpyのために、自動キャストここで私はPILの画像を利用

import numpy as np 
from PIL import Image 

def image_compare(image_1, image_2): 
    arr1 = np.array(image_1) 
    arr2 = np.array(image_2) 
    if arr1.shape != arr2.shape: 
     return False 
    maxdiff = np.max(np.abs(arr1 - arr2)) 
    return maxdiff == 0 

def image_compare_file(filename_1, filename_2): 
    im1 = Image.load(filename_1) 
    im2 = Image.load(filename_2) 
    return image_compare(im1, im2) 

ようになります適切な(numpyのを使用して)2つの画像を比較するために使用します。次に、次元が一致していることを確認し、絶対誤差の最大値を計算します。この最大値がゼロの場合、画像は同じです。今、あなたはちょうどあなたがすぐにスクリーンショットの違いを識別できるようになるの知覚差分ツールを使用してに興味があるかもしれません

if image_compare_file('file1.png','file2.png'): 
    pass # images in file are identical 
else: 
    pass # images differ 

または

if image_compare(image1,image2): 
    pass # images are identical 
else: 
    pass # images differ 
+0

これは私が必要とするものに近いようですが、1秒間に1つのスクリーンショットを保存し、同じ比較ファイルを何度も読み込む必要があるため、比較のために2つのファイルを読み込まないようにしています。 PIL.Image.ImageとPIL.pngImagePlugin.PngImageFileを使って作業する必要があります。 –

0

を呼び出すことができます。 imgdiffはPythonでこのためのツールをラップするライブラリです。簡易版は、おそらくthis answerのように、PILのImageChopで実装することができます。

知覚的相違取得の詳細について
import Image 
import ImageChops 

im1 = Image.open("splash.png") 
im2 = Image.open("splash2.png") 

diff = ImageChops.difference(im2, im1) 

Bret Slatkin's talk about using it for safe continuous deploymentをチェックしてください。

+0

いいですね。しかし、私はこの回答をどのように知っていますか? Diffはちょうど別のイメージを含んでいるようです。 –

+1

@GarethFranceそれはイメージですが、それをピクセル単位の違いを含む2D配列と考える方が便利です。あなたはそれにいくつかの計算を行う必要がある場合は、numpy ndarrayにImageオブジェクトを変換することができます。たとえば、 'diff'のすべての要素の合計が0である場合、2つの画像がピクセル完全一致であることがわかります。 – ahota

関連する問題