このhttp://labs.ideeinc.com/multicolrのようなユーティリティを構築しようとしていますが、使用しているアルゴリズムがわかりません。誰か知っていますか?
3 に答える
彼らがしているのは、ヒストグラムを一致させることだけです。
したがって、画像のヒストグラムを作成します。イメージのサイズでヒストグラムを正規化します。ヒストグラムは、色と同じ数の要素を持つベクトルです。32 ビット、24 ビット、場合によっては 16 ビットの精度も必要ないため、速度が低下するだけです。パフォーマンス上の理由から、ヒストグラムを 4、8、および 10 ~ 12 ビットにマップします。
least distance compare
すべての 4 ビット ヒストグラムとサンプル カラーの間で ファジーを実行します。- 次に、そのセットを取得して、8 ビットのヒストグラム比較を行います。
- 次に、10 ビットまたは 12 ビットのヒストグラムを残りのセットと比較します。合計セットを非常に少数の計算と比較して小さなサブセットを見つけるため、これは最高のパフォーマンスの検索になります。
- 次に、より多くの計算を行う小さなサブセットに取り組みます。
本当の大きなトリックは、類似したヒストグラムを照合するための最適なアルゴリズムを見つけることです。
距離の計算から始めます。3 次元では、次のようになったと思います。
SQRT((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)
記憶でやってますので、調べてみてください。
あなたの目的のために、3つ以上の次元を持つことになるので、より多くの用語があります。4 ビットのヒストグラムには 16 の項があり、8 ビットのヒストグラムには 256 の項があります。この種の計算は遅いので、実際には実行しないでください
SQRT
。画像のサイズを十分に小さく、たとえば 10,000 ピクセルに正規化するとx^2
、値 0..10,0000 に対してのみ行う必要があることがわかります。x^2
x が 0 から 10,000 までのルックアップ テーブルを事前に計算します。すると、計算が速くなります。パレットから色を選択したら、その色 = 10,0000 でヒストグラムを作成するだけです。2 を選択すると、color1=5000、color2=5000 などのヒストグラムが作成されます。
最終的には、アプリケーションを現実の世界に一致させるために、ごまかしの要因を追加する必要がありますが、これらはテストで見つけることができます。
データベース内の画像に存在する色のある種のクラスタリングを行うことをお勧めします。つまり、データベース内の各画像について:
- 画像の各ピクセルの色を収集する
- 収集された色に対してクラスタリング (5 つのクラスターを使用した k-mean クラスタリングとしましょう) を実行します
- クラスター化された色を画像の代表的な記述子として保存します
ユーザーが 1 つ以上のクエリの色のセットを提供すると、データベース内の各画像の指定された色と色記述子 (5 つの代表的な色) の間で最適な一致を選択する、ある種の貪欲な照合が行われます。
サイズによっては、アルゴリズム自体よりも検索インデックス作成の方が大きな問題になる可能性があるため、画像コレクションのサイズはどれくらいですか?
おそらく、画像で使用されている色のヒストグラムを作成し、ユーザーが選択した色に最適に適合させるだけです。