[PHP]類似画像検索のアイディア

この記事は、ある画像と、それに似た画像を探す方法についてのアイディアをまとめたものです。
似た色の画像を探す実例については、こちらの記事をお読みください。


類似する画像を探すには、画像を区分けし、各区分ごとに色を比較するのが簡単です。
仮に画像を 3×3 ピクセルの小さなサムネイルにリサイズした場合、比較するべき場所は、
9ブロックにわかれることになります。

3x3

後はそれぞれのピクセルの色を採取し、他の画像の同じブロックにある色と比較します。

検索対象のファイルが大量にある場合は、あらかじめデータベースに色情報をインデックスしておき、
それと比較すればある程度早く検索できると思います。

色を比較すると言っても方法は幾つもあります。
一つはコンピュータのディスプレイで使われている RGB 値(赤・緑・青の光の割合)を比較する方法です。
実際にためしてみると、RGB 値が近くても、人間の知覚では余り似ていないように感じられます。(→RGBによる比較

そこで、HSV による比較を試みました。HSV とは、色を「色相」「彩度」「明度」の度合いで考える方法です。
RGB から HSV への変換は比較的容易にでき、計算速度も高速です。
これによって、色の差をより人間の感覚に近い尺度で捉えることが出来るようになります。(→HSVによる比較

ここで問題となるのが、濃すぎる色や薄すぎる色でもコンピュータは厳密に色相を区別しますが、
人間にとっては区別しにくいという点です。つまり、限りなく薄い赤と、限りなく薄い青を比べた時、
人間の感覚ではほとんど同じに見えますが、色相の数値はかなり差が開いてしまうということです。

これらの問題を解決するためには、RGB を Lab 色空間上の座標に置き換える必要があります。
計算量は格段に増えますが、色を3次元空間上の点として扱うことが出来れば、2つの点の距離を測ることで色の差を調べることができます。(→Labによる比較

より良い類似画像検索をするのであれば、ユーザーがどのようなキーワードで検索し、
どの画像を選択したのかを記録しておくのも良いと思います。
この辺りはナイーブベイズ(単純ベイズ分類器)でユーザーの行動を学習させることで実現できると思います。

高速化を目指すのであれば、HSV の V (明度)に着目し、明るい色のグループ、中間のグループ、暗い色のグループに分けておくことで、検索対象を絞り込むのもひとつの手だと思います。