sha1 や md5 等で知られるファイルハッシュは、ファイルの1ビットでも異なると、全く別のダイジェスト値を返すように作られている。
一方で、 画像の情報をハッシュ化する際に、 画像の大きさや微妙な違いには目を瞑って同じような画像は同じダイジェスト値、似たような画像は似たようなダイジェスト値を得たい場合もある。
例えば、大きさの違う画像や、 jpeg, png の形式が異なる画像を 同じ画像として扱うようにしたい場合だ。
そのようなハッシュ関数はいくつか知られている。
- average hashing (aHash)
- perception hashing (pHash)
- difference hashing (dHash)
- wavelet hashing (wHash)
そのうち、上記の 4つ の計算を行えるのが、 Python の ImageHash ライブラリだ。
このライブラリ自体は ピュアな Python ライブラリなのだが、 依存しているパッケージが総じて C言語拡張モジュールなので Windows で動作させるにはすこし手間がかかる。
そこで、 cygwin 上の python にインストールする場合と、 Windows 上の CPython にインストールする方法をそれぞれ紹介しよう。
以下は virtualenv を使って仮想環境上にインストールする手順とするが、 直接 Python のシステム環境に入れてしまっても問題はない。
メモ: |
2017年現在、 pypi でプリコンパイル済みの依存モジュールがダウンロードできるので、以下の方法を使わなくても pip や pipenv コマンドだけでインストールが完了するはずだ。
|
cygwin を使う場合
Windows がダメなら Windows 上に Unix ライクのビルド環境入ればいいじゃないということで、 cygwin を使う方法。
cygwin の setup.exe で 以下の cygwin package とともに cygwin をインストールする。
x86, x64 どちらでも良いはずだ。
(依存関係をちゃんと確認していないので、個別に指定しなくてもインストールされるものが混じっているかも知れないのは、ご了承を)
- for SciPy:
- liblapack-devel
- libfftw3-devel
- python3-numpy
- libgmpxx4
- libmpc3
- libmpfr4
- gcc-fortran
- gcc-g++
- for Pillow
- libjpeg-devel
- zlib-devel
その後、 cygwin ターミナルを立ち上げ、 pip, virtualenv, ImageHash の順番でインストールしていく。
カレントディレクトリに VENV (この名前は任意の別の名前で良い) というディレクトリで python の仮想環境が作成されて、 そのフォルダの中に コンパイルされたモジュールが保存される。
python3 -m easy_install pip
python3 -m pip install virtualenv
python3 -m virtualenv VENV
source ./VENV/bin/activate
python3 -m pip install ImageHash
よっぽど性能の良いマシンじゃないと、コンパイルにかなり時間がかかるので、辛抱しよう。
Windows 上の CPython を使う場合
cygwin は使いたくない、やっぱり Windows 上の CPython を使いたいという場合。
ImageHash が依存しているパッケージのうち、 いくつかは Windows 上に Visual C++ がインストールされていれば、 pip でインストールした際に、自動的にコンパイルできるものもあるものの、 すべてがそのようにサポートされているわけではない。
…ということで、 Windows 上でコンパイルするのは早々に諦め、有志がコンパイルしてくれたコンパイル済みモジュールを使うことにする。
既に 32bit 版か 64bit 版の CPython 3.5系 がインストールされていて、 python (.\python.exe, .\Scripts*) へのパスが通っているのを前提とする。 pip は自動でインストールされているはずだ。
また、 2.7 系を使う場合も大まかな手順は同じなので、 適宜読み替えてもらえれば問題ない。
まずは、 cygwin と同様、 カレントディレクトリに VENV (この名前は任意の別の名前で良い) というディレクトリで python の仮想環境が作成する。
pip install virtualenv
virtualenv VENV
.\VENV\Scripts\activate
次に、 Unofficial Windows Binaries for Python Extension Packages にアクセスして、 numpy, scipy, pillow, pywavelets のコンパイル済み *.whl ファイルをダウンロードする。
python のバージョンが 3.5 で 64bit 版なら numpy-1.11.1+mkl-cp35-cp35m-win_amd64.whl
を、 2.7 で 32bit 版なら numpy-1.11.1+mkl-cp27-cp27m-win32.whl
を、 といったように 自分の環境に合わせたものをダウンロードしよう。
ここで注意しなくてはいけないのは、 必ずひとつずつファイルをダウンロードすること だ。
上記サイトではツールによるダウンロードや並列ダウンロード、分割ダウンロードが行えないような対策をしているらしく、 ちゃんとひとつずつ落とさないと正しいパッケージがダウンロードできない。
一見ちゃんと落とせたように見えても、 *.whl is not a supported wheel on this platform.
などとエラーが発生してしまうことがある。
ダウンロードした *.whl を使って、 numpy, scipy, pillow, PyWavelets の順でインストールし、 最後に ImageHash をインストールしよう。
pip install numpy-1.11.1+mkl-cp35-cp35m-win_amd64.whl
pip install scipy-0.17.1-cp35-cp35m-win_amd64.whl
pip install Pillow-3.3.0-cp35-cp35m-win_amd64.whl
pip install PyWavelets-0.4.0-cp35-none-win_amd64.whl
pip install ImageHash
試しに Perception Hash を計算してみる
インストールがうまくいったら、 python インタプリタを起動して、 試しに Perception Hash (phash) を計算してみよう。
計算コードのサンプルは PyPI の ImageHash のページ に記載されている。
from PIL import Image
import imagehash
hash = imagehash.phash(Image.open(r'test.png'))
print(hash)
# -> d879f8f89b1bbf
otherhash = imagehash.phash(Image.open(r'other.bmp'))
print(otherhash)
# -> ffff3720200ffff
print(hash == otherhash)
# -> False
print(hash - otherhash)
# -> 36