2016-10-15 6 views
1

指紋で画像の重複を見つける方法を探しています。私はこれが画像にハッシュ関数を適用することによって行われ、各画像は固有のハッシュ値を持つことを理解しています。フィンガープリントによる画像の比較

私は画像処理に新しい経験があり、ハッシュについてはあまり知られていません。どのくらい正確にハッシュ関数を適用し、ハッシュ値を生成する必要がありますか?事前に

おかげ

答えて

2

JPEGやPNGなどの一部の画像形式、日付/時刻などの画像の保存には注意が必要です.2つの同一の画像は、md5cksumなどの通常のツールとは異なるように見えます。 。

ここは例です。今二つの画像、ターミナルでコマンドラインで128×128の同じ赤い四角の両方とImageMagickの

convert -size 128x128 xc:red a.png 
convert -size 128x128 xc:red b.png 

enter image description here enter image description here

を作る彼らのMD5サムを確認してください。

md5 [ab].png 
MD5 (a.png) = b4b82ba217f0b36e6d3ba1722f883e59 
MD5 (b.png) = 6aa398d3aaf026c597063c5b71b8bd1a 

たり、チェックサム:

cksum [ab].png 
4158429075 290 a.png 
3657683960 290 b.png 

おおよそ、md5cksumの両方で異なります。どうして?日付は1秒間隔ですから。

私はあなたがチェックサム「単なる画像データ」ではなく、メタデータにImageMagickのを使用することをお勧め - 、もちろん、日付があなたにとって重要でない限り:

identify -format %# a.png 
e74164f4bab2dd8f7f612f8d2d77df17106bac77b9566aa888d31499e9cf8564 

identify -format %# b.png 
e74164f4bab2dd8f7f612f8d2d77df17106bac77b9566aa888d31499e9cf8564 

今、彼らは両方とも画像は同じなので同じ - メタデータだけが異なります。もちろん

、あなたは、2枚の画像「を同じように見える」場合は、単にアイデアを得る「知覚ハッシュ」でより興味があるかもしれません。その場合はhereとしてください。

また、輝度、方向、またはクロッピングのわずかな違いを許可することもできます。これは別のトピックです。

0

あなたがこれを達成することができますが、最も単純なbase64文字列に画像を変換して、標準ハッシュライブラリを用いることであろう多くの方法があります。あなたはちょうどあなたが大丈夫でなければなりません別に1(おそらく大)文字列を回すなどのハッシュ関数を考える場合

import base64 
import md5 



with open("foo.png", "rb") as image_file: 
    encoded_string = base64.b64encode(image_file.read()) 
    m = md5.new() 
    m.update(encoded_string) 
    fingerprint = m.hexdigest() 
    print(fingerprint) 

:Pythonで、それは次のようになります。上記のコードでは、m.update()は、encoded_string(非常に大きなbase64文字列)をm.hexdigest()を呼び出して取得したより小さな16進文字列に変換するだけです。

md5ライブラリhereのpythonドキュメントを読むことができますが、使用している言語に似ているはずです。

0

のサイズが変更された画像を含む重複の近くにある場合は、差分ハッシュを適用できます。 hereハッシングの詳細下のコードは、Real Pythonのブログ投稿から編集してPython 3で動作させています。これは、さまざまな種類のハッシュに関する情報を持つ、上にリンクされたハッシュライブラリを使用しています。スクリプトをコピー&ペーストするだけで、スクリプトを編集することなくコマンドラインからスクリプトを直接実行することができます。

この最初のスクリプト(index.py)は、イメージごとに差分ハッシュを作成し、ハッシュを後でデータベースのようにアクセスできる棚または永続的辞書に、そのイメージファイル名ハッシュ:コマンドラインで

from PIL import Image 
import imagehash 
import argparse 
import shelve 
import glob 

# This is just so you can run it from the command line 
ap = argparse.ArgumentParser() 
ap.add_argument('-d', '--dataset', required = True, 
       help = 'path to imput dataset of images') 

ap.add_argument('-s', '--shelve', required = True, 
       help = 'output shelve database') 
args = ap.parse_args() 

# open the shelve database 
db = shelve.open(args.shelve, writeback = True) 

# loop over the image dataset 
for imagePath in glob.glob(args.dataset + '/*.jpg'): 
    # load the image and compute the difference in hash 
    image = Image.open(imagePath) 
    h = str(imagehash.dhash(image)) 
    print(h) 

    # extract the filename from the path and update the database using the hash 
    # as the key and the filename append to the list of values 

    filename = imagePath[imagePath.rfind('/') + 1:] 
    db[h] = db.get(h, []) + [filename] 

db.close() 

ラン:

python index.py --dataset ./image_directory --shelve db.shelve 

実行Jupyterのノートブックで

%run index.py --dataset ./image_directory --shelve db.shelve 

すべてがシェルフに保存されているので、確認したい画像ファイル名で棚を照会することができます。一致する画像のファイル名を印刷し、一致する画像も開きます。

コマンドラインで
from PIL import Image 
import imagehash 
import argparse 
import shelve 

# arguments for command line 
ap = argparse.ArgumentParser() 
ap.add_argument("-d", "--dataset", required=True, 
      help="path to dataset of images") 
ap.add_argument("-s", "--shelve", required=True, 
      help="output the shelve database") 
ap.add_argument("-q", "--query", required=True, 
      help="path to the query image") 
args = ap.parse_args() 

# open the shelve database 
db = shelve.open(args.shelve) 

# Load the query image, compute the difference image hash, and grab the images 
# from the database that have the same hash value 
query = Image.open(args.query) 
h = str(imagehash.dhash(query)) 
filenames = db[h] 
print("found {} images".format(len(filenames))) 

# loop over the images 
for filename in filenames: 
    print(filename) 
    image = Image.open(args.dataset + "/" + filename) 
    image.show() 

# close the shelve database 
db.close() 

ランは再び、これはpython2.7のために書かれている上記のリンクReal Pythonブログ記事から修正され./directory/someimage.jpg

python search.py —dataset ./image_directory —shelve db.shelve —query ./directory/someimage.jpg 

と同じハッシュを持つイメージにimage_directoryに目を通すと、なくてはいけません箱を作ってください!必要に応じてコマンドラインを変更してください。私が正しく覚えていれば、python 2/3の問題は​​であり、画像ライブラリではありませんでした。