「画像の類似度を判定したい」
「画像のハッシュ値を求めたい」
「Pythonで画像を自動的に比較したい」
このような場合には、ImageHashがおススメです。
この記事では、ImageHashについて解説しています。
本記事の内容
- ImageHashとは?
- ImageHashのシステム要件
- ImageHashのインストール
- ImageHashの動作確認
それでは、上記に沿って解説していきます。
ImageHashとは?
ImageHashとは、Pythonで書かれた画像ハッシュライブラリです。
以下のアルゴリズムをサポートしています。
- Average hashing
- Perceptual hashing
- Difference hashing
- Wavelet hashing
- HSV color hashing (colorhash)
- Crop-resistant hashing
画像のハッシュ値を求めることにより、画像を類似度を比較できます。
このことにより、プログラムで画像の類似度を判定できるのです。
「同じ画像なのか」
「似たような画像なのか」
「全く異なる画像なのか」
このようなことを、自動的に行うことができるようになります。
画像を扱う処理については、AI(人工知能・ディープラーニング)が得意なところです。
しかし、このような単純比較であれば、ImageHashで事足ります。
それに、ImageHashの方が処理速度は高速です。
以上、ImageHashについて説明しました。
次は、ImageHashのシステム要件を確認しましょう。
ImageHashのシステム要件
現時点(2021年11月)でのImageHashの最新バージョンは、4.2.1となります。
この最新バージョンは、2021年7月15日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応だと思われます。
- Windows
- macOS
- Linux
setup.upを見る限り、OS依存はありません。
また、サポート対象となるPythonのバージョンも記述がありません。
このような場合は、依存ライブラリを確認します。
以下が、setup.pyに記述されている依存ライブラリ(パッケージ)です。
- Six
- NumPy
- SciPy
- Pillow
- PyWavelets
Six以外は、次のPython公式開発サイクルに準じています。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
ただし、Python 3.6は除外されています。
Python 3.6も2021年末でサポート期限が切れますからね。
よって、ImageHashがサポートするのはPython 3.7以降と言えますね。
それが無難です。
以上、ImageHashのシステム要件を説明しました。
次は、ImageHashのインストールを行います。
ImageHashのインストール
検証は、次のバージョンのPythonで行います。
> python -V Python 3.9.8
まずは、現状のインストール済みパッケージを確認しておきます。
> pip list Package Version ---------- ------- pip 21.3.1 setuptools 58.5.3 wheel 0.36.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、ImageHashのインストールです。
ImageHashのインストールは、以下のコマンドとなります。
pip install ImageHash
インストールは、すぐに終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。
> pip list Package Version ---------- ------- ImageHash 4.2.1 numpy 1.21.4 Pillow 8.4.0 pip 21.3.1 PyWavelets 1.2.0 scipy 1.7.2 setuptools 58.5.3 six 1.16.0 wheel 0.36.2
上記で挙げた依存パッケージを確認できます。
問題ないですね。
以上、ImageHashのインストールについての説明でした。
最後は、ImageHashの動作確認を行います。
ImageHashの動作確認
ImageHashを使って画像を比較してみます。
類似度を数字で求めることが可能です。
そのためには、画像を二つ用意しましょう。
one.jpg

other.jpg

ohert.jpgは、one.jpgを横に反転しただけです。
これらの画像を使って、ImageHashの動作確認を行います。
それが、次のコードとなります。
from PIL import Image import imagehash hash = imagehash.average_hash(Image.open('one.jpg')) print(hash) otherhash = imagehash.average_hash(Image.open('other.jpg')) print(otherhash) print(hash == otherhash) print(hash - otherhash)
上記を実行した結果は、以下。
bf8cffefdf000000 fd31fff7fb000000 False 12
まずは、それぞれの画像のハッシュ値を求めます。
そして、それを比較した結果が「False」です。
違う画像なので、「False」で正解と言えます。
また、差分は「12」ということです。
この数字が大きいと類似度は、低いような傾向があります。
小さいと類似度は、高いような感じです。
つまり、「0」なら同じ画像という判定になります。
同じ画像(one.jpg)を設定した場合の実行結果は、以下。
bf8cffefdf000000 bf8cffefdf000000 True 0
では、次のような全然異なる画像と比較した場合はどうなるのでしょうか?
dog.jpg

one.jpgとdog.jpgを比較した結果は、以下。
bf8cffefdf000000 ffff3f1cf7c60000 False 20
以上より、ImageHashを使うと簡単に画像の比較ができます。