ソフトウェアのスクリーンショットである2つの画像を比較する必要があります。画像に表示されている数字や文字を含め、2つの画像が同一であるかどうかを確認したいと思います。これはどのように達成できますか?
4 に答える
適切な比較を行うには、次の方法があります。
- 1つ目は、二乗平均平方根の差です。
2つの画像がどの程度類似しているかを測定するために、画像間の差の二乗平均平方根(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]))
- もう1つは正確な比較です#
2つの画像の内容がまったく同じであるかどうかを判断する最も簡単な方法は、2つの画像の差を取得してから、この画像の非ゼロ領域のバウンディングボックスを計算することです。画像が同一の場合、差分画像のすべてのピクセルはゼロであり、バウンディングボックス関数はNoneを返します。
import ImageChops
def equal(im1, im2):
return ImageChops.difference(im1, im2).getbbox() is None
2つの画像を比較するためにStructuredSimilarity(SSIM)メソッドを使用するpyssimと呼ばれるPythonライブラリを維持しています。
Pythonバインディングはありませんが、perceptualdiffプログラムは、2つの画像を比較するのにも優れており、非常に高速です。
すぐに使える答えを出すことはできませんが、正しい方向に向けます(私は思います)。2つの画像を比較する簡単な方法は、それらのバイナリ表現のハッシュを作成し、それらのハッシュが同じであるかどうかを確認することです。これに関する問題の1つは、使用するハッシュ関数にあり、衝突の可能性が低いものを探す必要があります。もう1つは、画像ファイルに元のバイナリ情報にメタデータが添付されている可能性があるため、調べる必要があります。バイナリ情報のみを使用して画像を比較するために、そのメタデータを切り取る方法について。また、よくわかりませんが、jpgでエンコードされた画像のバイナリ表現はpngでエンコードされた画像とは異なる可能性があるため、注意が必要です。
これにつまずいて、受け入れられた答えがうまくいかなかった人のために、私はこれをここに投稿しています。
同様のシナリオで、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()
ことにより、画像を区別できるスコアを取得します。最も近いものはスコアが最も小さいものです