プロジェクトでは、似たような色をクラスターの平均色に置き換えるカラークラスタリングアルゴリズムを実装したいと考えています。
今のところ、kmeans-algorithm を使用して画像全体をクラスター化します。しかし、これは長い時間がかかります。kmeans を使用して color-histogram をクラスター化する方法を誰かが知っているので、このアルゴリズムを実行できますか?
プロジェクトでは、似たような色をクラスターの平均色に置き換えるカラークラスタリングアルゴリズムを実装したいと考えています。
今のところ、kmeans-algorithm を使用して画像全体をクラスター化します。しかし、これは長い時間がかかります。kmeans を使用して color-histogram をクラスター化する方法を誰かが知っているので、このアルゴリズムを実行できますか?
最初に画像をダウンサンプリングしてから、k-means を実行します。
画像のサイズを x と y の両方で 1/2 に変更しても、色にはあまり影響しませんが、k-means は最大で 1/4 の時間しかかかりません。幅と高さの 1/10 にリサンプリングすると、k-means は 100 倍速く実行されます。
https://en.wikipedia.org/wiki/Color_quantization
画像をダウンサンプリングすると、クラスタリング中に処理する「ピクセル」が少なくなります。しかし、最終的にはほぼ同じ配色になるはずです。
したがって、実際の出力は画像または画像領域ではありません。パレットです。
次に、各ピクセルを最も近い色に置き換えるだけで、任意の画像(フル解像度バージョンを含む) をこのカラー パレットにマッピングできます。
k-means の複雑さは ですO(n*k*i)
。ここn
で、 はピクセル数、kは目的の出力色数、iは収束までに必要な反復回数です。
n
n
: ダウンサンプリングすることで、最大の要因であるを簡単に減らすことができます。多くの場合、パフォーマンスの低下が見られる前に、これを大幅に削減できます。
k
: これは、希望する出力色数です。これを削減できるかどうかは、実際のユースケースによって異なります。
i
: さまざまな要因が収束に影響を与える可能性があります (他の両方の要因を含む!) が、おそらく最も強いのは開始値が適切であることです。したがって、パレットを選択する方法が非常に高速ですが品質が低い場合は、まずそれを実行してから、k-means を使用してこのパレットを調整します。ただし、OpenCV には、これに適したヒューリスティックが既に含まれている可能性があります。
ご覧のとおり、最も簡単な方法は を減らすことn
です。大幅に削減n
し、サムネイル用に最適化されたパレットを生成してから、このパレットを調整する完全な画像で k-means を再実行できます。うまくいけば、これにより反復回数が大幅に削減されるため、非常にうまく機能する場合があります。
私の答えはヒストグラムのクラスタ化とは関係ありませんが、最近、アルゴリズムのクラスタ化手順を高速化する必要があります。このために、次のことを行いました。
これは、クラスタ化を高速化するのに非常に役立ちました。また、OpenCV のmean-shift filteringを試してみることもできます。
各データに重み、つまりヒストグラム ビンの値の数を割り当てる必要があります。次に、クラスターの重心の新しい値を計算するときは、単純な平均ではなく加重平均を使用します。しかし、OpenCV KMeans クラスタリングのインターフェースは加重値をサポートしていません。それをサポートし、十分に文書化されており (バイオインフォマティクスから例をとっていますが)、簡単に統合できる (単一の .h/.c ファイル) C クラスタリング ライブラリを使用できます。