0

2 つの画像を比較するアルゴリズムを探しています (Python を使用しています)。

PIL ライブラリ、numpy/scipy、opencv が見つかりました。グレースケール、バイナリ、ヒストグラムの作成方法を知っています....それは問題ありませんが、「はい、似ている//おそらく似ている」と言うために2つの画像をどうする必要があるかわかりません// 一致しません」.

正しい方法を知っていますか?

4

3 に答える 3

1

それらがバイナリに等しいかどうかを確認したい場合は、それらのチェックサムを数えて比較することができます。それらが他の方法で類似しているかどうかを確認したい場合、それはより複雑になり、StackOverflowに投稿された単純な答えには間違いなく適合しません。類似性をどのように定義するかによって異なりますが、とにかく、優れたプログラミングスキルと多くのコードの記述が必要になります。

于 2012-07-02T07:55:57.060 に答える
1

単純な実装は、2 つの画像間の対応する正規化されたピクセル座標間のエラー/非類似性を集計することです。より高度な技術には、空間的特徴の比較 (特徴検出/コンピューター ビジョン技術を使用)、および色分布/頻度技術が含まれます。また、許容範囲を広げるために画像を比較する前に、(アルゴリズム的に、または 3D コンテキストの場合はハードウェア/ミップマッピングを使用して) 画像を縮小して実験することもできます。最先端のAFAIKは、画像のウェーブレット変換/表現です。

もちろん、pHashなど、これを行う既存のライブラリを検索することもできます。

于 2012-07-02T07:57:10.993 に答える
0

画像の変化を視覚的に検査するために、私がまとめたスクリプト。結果は、異なるピクセルを除いて白い画像になります。ピクセルは比例して暗くなり、差が大きくなります。また、色の変化を示すために「着色」されています。たとえば、古い画像がより赤かった場合、差分画像にはシアンの領域が表示されます。代わりに新しい画像の方が読みやすい場合は、差分画像に赤い領域が表示されます。

唯一の欠点は遅いことですが、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])
于 2016-03-11T23:36:50.507 に答える