指紋で画像の重複を見つける方法を探しています。私はこれが画像にハッシュ関数を適用することによって行われ、各画像は固有のハッシュ値を持つことを理解しています。フィンガープリントによる画像の比較
私は画像処理に新しい経験があり、ハッシュについてはあまり知られていません。どのくらい正確にハッシュ関数を適用し、ハッシュ値を生成する必要がありますか?事前に
おかげ
指紋で画像の重複を見つける方法を探しています。私はこれが画像にハッシュ関数を適用することによって行われ、各画像は固有のハッシュ値を持つことを理解しています。フィンガープリントによる画像の比較
私は画像処理に新しい経験があり、ハッシュについてはあまり知られていません。どのくらい正確にハッシュ関数を適用し、ハッシュ値を生成する必要がありますか?事前に
おかげ
JPEGやPNGなどの一部の画像形式、日付/時刻などの画像の保存には注意が必要です.2つの同一の画像は、md5
とcksum
などの通常のツールとは異なるように見えます。 。
ここは例です。今二つの画像、ターミナルでコマンドラインで128×128の同じ赤い四角の両方とImageMagickの
convert -size 128x128 xc:red a.png
convert -size 128x128 xc:red b.png
を作る彼らのMD5サムを確認してください。
md5 [ab].png
MD5 (a.png) = b4b82ba217f0b36e6d3ba1722f883e59
MD5 (b.png) = 6aa398d3aaf026c597063c5b71b8bd1a
たり、チェックサム:
cksum [ab].png
4158429075 290 a.png
3657683960 290 b.png
おおよそ、md5
とcksum
の両方で異なります。どうして?日付は1秒間隔ですから。
私はあなたがチェックサム「単なる画像データ」ではなく、メタデータにImageMagickのを使用することをお勧め - 、もちろん、日付があなたにとって重要でない限り:
identify -format %# a.png
e74164f4bab2dd8f7f612f8d2d77df17106bac77b9566aa888d31499e9cf8564
identify -format %# b.png
e74164f4bab2dd8f7f612f8d2d77df17106bac77b9566aa888d31499e9cf8564
今、彼らは両方とも画像は同じなので同じ - メタデータだけが異なります。もちろん
、あなたは、2枚の画像が「を同じように見える」場合は、単にアイデアを得る「知覚ハッシュ」でより興味があるかもしれません。その場合はhereとしてください。
また、輝度、方向、またはクロッピングのわずかな違いを許可することもできます。これは別のトピックです。
あなたがこれを達成することができますが、最も単純な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ドキュメントを読むことができますが、使用している言語に似ているはずです。
のサイズが変更された画像を含む重複の近くにある場合は、差分ハッシュを適用できます。 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の問題はであり、画像ライブラリではありませんでした。