2 つの画像を比較するアルゴリズムを探しています (Python を使用しています)。
PIL ライブラリ、numpy/scipy、opencv が見つかりました。グレースケール、バイナリ、ヒストグラムの作成方法を知っています....それは問題ありませんが、「はい、似ている//おそらく似ている」と言うために2つの画像をどうする必要があるかわかりません// 一致しません」.
正しい方法を知っていますか?
それらがバイナリに等しいかどうかを確認したい場合は、それらのチェックサムを数えて比較することができます。それらが他の方法で類似しているかどうかを確認したい場合、それはより複雑になり、StackOverflowに投稿された単純な答えには間違いなく適合しません。類似性をどのように定義するかによって異なりますが、とにかく、優れたプログラミングスキルと多くのコードの記述が必要になります。
単純な実装は、2 つの画像間の対応する正規化されたピクセル座標間のエラー/非類似性を集計することです。より高度な技術には、空間的特徴の比較 (特徴検出/コンピューター ビジョン技術を使用)、および色分布/頻度技術が含まれます。また、許容範囲を広げるために画像を比較する前に、(アルゴリズム的に、または 3D コンテキストの場合はハードウェア/ミップマッピングを使用して) 画像を縮小して実験することもできます。最先端のAFAIKは、画像のウェーブレット変換/表現です。
画像の変化を視覚的に検査するために、私がまとめたスクリプト。結果は、異なるピクセルを除いて白い画像になります。ピクセルは比例して暗くなり、差が大きくなります。また、色の変化を示すために「着色」されています。たとえば、古い画像がより赤かった場合、差分画像にはシアンの領域が表示されます。代わりに新しい画像の方が読みやすい場合は、差分画像に赤い領域が表示されます。
唯一の欠点は遅いことですが、numpy を使用するか、単にピクセル グループを処理する内包表記を使用して改善できると確信しています。
#!/usr/bin/env python
TINT = 1 # exxagerate differences in tone
MINUTE = 5 # less than "x" points of difference
INCREASE_MINUTE = 2 # boost of minute differences
import sys
from PIL import Image
img1 = Image.open(sys.argv[1])
img2 = Image.open(sys.argv[2])
i1 = img1.load()
i2 = img2.load()
if img1.size != img2.size:
print "Images %s and %s have different sizes, cannot compare" \
% (sys.argv[1], sys.argv[2])
sys.exit(1)
imgmap = Image.new( 'RGB', img1.size, "white")
imap = imgmap.load()
row_averages = []
for y in range(img1.size[1]):
for x in range(img1.size[0]):
p1 = i1[x, y]
p2 = i2[x, y]
diffpixel = [255, 255, 255]
# color differences
diffs = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]]
absdiff = reduce(lambda a, b: abs(a) + abs(b), diffs)
diffsmag = [a * TINT for a in diffs]
diffplus = [max(0, a) for a in diffs]
totplus = reduce(lambda a, b: a + b, diffplus)
diffminus = [min(0, a) for a in diffs]
# apply negative differences (e.g. less red -> take red)
diffpixel = [ a + b for a, b in zip(diffpixel, diffminus)]
# subtract positive differences (e.g. more red -> take from non-red channels)
diffpixel = [ a - totplus for a in diffpixel ]
# ... put back what we took from red
diffpixel = [ a + b for a, b in zip(diffpixel, diffplus)]
if absdiff > 0 and absdiff < MINUTE:
# Increase contrast of minute differences
diffpixel = [a - INCREASE_MINUTE for a in diffpixel]
diffpixel = [max(0, a) for a in diffpixel]
imap[x, y] = tuple(diffpixel)
imgmap.save(sys.argv[3])