6

プロジェクトでは、似たような色をクラスターの平均色に置き換えるカラークラスタリングアルゴリズムを実装したいと考えています。

今のところ、kmeans-algorithm を使用して画像全体をクラスター化します。しかし、これは長い時間がかかります。kmeans を使用して color-histogram をクラスター化する方法を誰かが知っているので、このアルゴリズムを実行できますか?

4

3 に答える 3

5

最初に画像をダウンサンプリングしてから、k-means を実行します。

画像のサイズを x と y の両方で 1/2 に変更しても、色にはあまり影響しませんが、k-means は最大で 1/4 の時間しかかかりません。幅と高さの 1/10 にリサンプリングすると、k-means は 100 倍速く実行されます。

https://en.wikipedia.org/wiki/Color_quantization

画像をダウンサンプリングすると、クラスタリング中に処理する「ピクセル」が少なくなります。しかし、最終的にはほぼ同じ配色になるはずです。

k平均の簡単な要約:

  1. 各オブジェクト (= ピクセル) を最も近いクラスターの中心 (= パレット エントリ) にマップします。
  2. 割り当てられたポイント (= ピクセル) を最もよく表すために、各パレット エントリを再計算します。
  3. 何も変わらなくなるまで繰り返します。

したがって、実際の出力は画像または画像領域ではありません。パレットです。

次に、各ピクセルを最も近い色に置き換えるだけで、任意の画像(フル解像度バージョンを含む) をこのカラー パレットにマッピングできます。

複雑さとパフォーマンス:

k-means の複雑さは ですO(n*k*i)。ここnで、 はピクセル数、kは目的の出力色数、iは収束までに必要な反復回数です。

nn: ダウンサンプリングすることで、最大の要因であるを簡単に減らすことができます。多くの場合、パフォーマンスの低下が見られる前に、これを大幅に削減できます。

k: これは、希望する出力色数です。これを削減できるかどうかは、実際のユースケースによって異なります。

i: さまざまな要因が収束に影響を与える可能性があります (他の両方の要因を含む!) が、おそらく最も強いのは開始値が適切であることです。したがって、パレットを選択する方法が非常に高速ですが品質が低い場合は、まずそれを実行してから、k-means を使用してこのパレットを調整します。ただし、OpenCV には、これに適したヒューリスティックが既に含まれている可能性があります。

ご覧のとおり、最も簡単な方法は を減らすことnです。大幅に削減nし、サムネイル用に最適化されたパレットを生成してから、このパレットを調整する完全な画像で k-means を再実行できます。うまくいけば、これにより反復回数が大幅に削減されるため、非常にうまく機能する場合があります。

于 2012-11-28T23:28:47.833 に答える
1

私の答えはヒストグラムのクラスタ化とは関係ありませんが、最近、アルゴリズムのクラスタ化手順を高速化する必要があります。このために、次のことを行いました。

  1. 画像を小さいサイズにリサイズしました(実際にはすでに提案されていました)
  2. 色数の削減 (画像の量子化)。ここで提案したとおりに実行しました: OpenCV を使用して画像の色数を減らす方法は? .

これは、クラスタ化を高速化するのに非常に役立ちました。また、OpenCV のmean-shift filteringを試してみることもできます。

于 2012-11-29T12:53:59.987 に答える
0

各データに重み、つまりヒストグラム ビンの値の数を割り当てる必要があります。次に、クラスターの重心の新しい値を計算するときは、単純な平均ではなく加重平均を使用します。しかし、OpenCV KMeans クラスタリングのインターフェースは加重値をサポートしていません。それをサポートし、十分に文書化されており (バイオインフォマティクスから例をとっていますが)、簡単に統合できる (単一の .h/.c ファイル) C クラスタリング ライブラリを使用できます。

于 2012-11-29T09:11:30.750 に答える