こんな人に役に立つ
- 2枚の画像が同じ画像か判別したい。
- 可能な限り簡易的にやりたい。
- 厳密性は求めない。
こんな人に役に立たない
- リサイズされていても同一視したい。
- 類似度を考慮したい。
なぜPillowで判別するのか
判別した流れでPillowでリサイズとかできて便利です。
「Python 画像 同じ」とかで調べたら、リサイズとかを考慮したやつしか出てこなかったので、もっと簡易的なやつを紹介します。
コード
とても簡単です。
一応たくさんコメントを書いておきました〜
# imgディレクトリに画像が入っている前提
from PIL import Image
import os
# このファイルがあるディレクトリの絶対パス
base_dir = os.path.abspath(os.path.dirname(__file__))
# 画像のハッシュを求める(正確にはハッシュではないけど)
def img_hash(filename):
# ファイル名から絶対パスを求める
pil_img = Image.open(base_dir + '/img/' + filename)
# 画像を10x10にリサイズする
pil_img = pil_img.resize((10, 10), Image.ANTIALIAS)
# グレースケールに変換
pil_img = pil_img.convert('L')
# 100マスの色の数値を取得(この時点ではPILのオブジェクト)
data = pil_img.getdata()
# 数値を文字列にして、リストにする
data_list = map(str, list(data))
# くっつけて返す
return ''.join(data_list)
print('01.jpg: ', img_hash('01.jpg')) # 728091867896130143159161748895106...
print('02.jpg: ', img_hash('02.jpg')) # 728091867896130143159161748895106...
print('03.jpg: ', img_hash('03.jpg')) # 255255255255246224215245255255255...
print(img_hash('01.jpg') == img_hash('02.jpg')) # True
print(img_hash('01.jpg') == img_hash('03.jpg')) # False
こんな感じです。
アンチエイリアスはやる意味はよくわからないけど、参考元がやってたのでやりました〜
参考