勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPにて「ImageHash」ライブラリを使用し画像の類似度を算出する方法

  PHP

以前にPHPの「image-comparator」ライブラリで画像の類似度を算出する方法をメモしたが、今回は「ImageHash」ライブラリというものを見つけたのでこちらで同じようなことを試してみたい。以下にサンプルと利用方法をメモ。

 

サンプル

https://taitan916.info/sample/ImageHash/

 

ImageHash

GitHub

https://github.com/jenssegers/imagehash

 

インストール

サーバにSSH接続し以下コマンドでインストールする。

composer require jenssegers/imagehash

 

利用方法

ソースコード

<?php
require 'vendor/autoload.php';
use Jenssegers\ImageHash\Hash;
use Jenssegers\ImageHash\ImageHash;
use Jenssegers\ImageHash\Implementations\DifferenceHash;

$hasher = new ImageHash(new DifferenceHash());

//画像をハッシュ化
$hash_1 = $hasher->hash('./img/001.webp');

//データベースに保存するために64bit化
$hash_1_bit = $hash_1->toBits();
var_dump($hash_1_bit); //0010011101000011000100110011011100110111001111100010111001101111

//データベースから取り出した値をハッシュに変換
$hash_1_hash = Hash::fromBits($hash_1_bit);

$hash_2 = $hasher->hash('./img/002.webp');

//類似度の算出
$distance = $hasher->distance($hash_1_hash, $hash_2);
var_dump($distance); //29

類似度について

「image-comparator」ライブラリとは異なり、類似度は数値が小さい方が類似しているという判定になる。

サイト上で使う場合には「100 - 算出した類似度」で表示したいところだけど、GitHubにて「等しい画像の距離が常に0になるとは限らない」との但し書きがある点に注意(同じ画像でも類似度100にならない可能性あり)。

MySQLと連携する場合

MySQLと連携する場合は64bit化したものをデータベースに格納しておき、以下の記事の通り算出すると良い。

MySQLとPHPの「image-comparator」ライブラリを使用して類似画像検索を実装する方法

 

所感

「image-comparator」の時も思ったが、あまり類似度の精度が高くないように思われる。この辺り何とかならないのか調査しておきたいところ。

 - PHP

  関連記事

Python3.9系&Tesseractを用いて画像をOCR処理する方法
Python3.9系&Tesseractを用いて画像をOCR処理する方法

以前にGASとDrive APIを組み合わせて画像をOCR処理する方法をメモした ...

ブラウザがWebP対応の場合はそのまま表示し、非対応の場合はjpg/png画像を表示させる方法
ブラウザがWebP対応の場合はそのまま表示し、非対応の場合はjpg/png画像を表示させる方法

ページ表示時にブラウザがWebP画像に対応している場合はそのまま表示し、非対応の ...

lazyload.js等のライブラリを使わずHTMLのみで画像の遅延読み込みを行う方法
lazyload.js等のライブラリを使わずHTMLのみで画像の遅延読み込みを行う方法

画像を遅延読み込みさせるとなるとだいぶ前に書いたlazyload.jsを用いる方 ...

summernoteで画像選択時にサーバにファイルをアップロードする方法
summernoteで画像選択時にサーバにファイルをアップロードする方法

summernoteで画像を選択した際、ファイルはアップロードされずBase64 ...

PHPで縦横どちらかが指定の長さを超えた場合、比率を保ったままリサイズ
PHPで縦横どちらかが指定の長さを超えた場合、比率を保ったままリサイズ

PHPで縦横どちらかが指定の長さを超えた場合、 比率を保ったままリサイズしたかっ ...