本文へスキップ

k-meansクラスタリングと画像の代表色抽出をTypeScriptで実装する【画像処理100本ノック】

3
AIで生成された記事

概要

Q.88〜92ではk-means法を実装します。前半は画像ごとの特徴ベクトルをクラスタリングし、 後半は画像内の全画素をRGB空間でクラスタリングして代表色へ減色します。

k-meansの反復処理

k-meansは次の2処理を、割り当てが変わらなくなるまで繰り返します。

  1. 各データを最も近い重心へ割り当てる
  2. クラスタ内のデータの平均から重心を更新する
while (changed) {
  changed = assignNearestCentroid(features, centroids, labels);
  centroids = updateCentroids(features, labels, k);
}

画像特徴のクラスタリング(Q.88〜90)

問題 内容
Q.88 ランダムな初期ラベルからクラスタごとの重心を作る
Q.89 再割り当てと重心更新を収束まで繰り返す
Q.90 初期ラベルを変え、結果の変化を確認する

入力にはQ.84と同じ色ヒストグラム特徴を使います。正解ラベルを使わず、色分布の近い画像が 同じグループへ集まるかを確認します。

画像のk-means減色(Q.91、Q.92)

画像1枚の各画素をRGBの3次元データとして扱います。Q.91では5個の初期代表色を選び、各画素を 最も近い色へ分類します。Q.92では代表色をクラスタ内画素の平均へ更新し、収束まで繰り返します。

最後に各画素を所属クラスタの代表色で置き換えると、画像全体を5色で表現できます。Q.6の 固定した4階調への減色と違い、入力画像の色分布に応じた代表色が得られます。

初期値と空クラスタ

k-meansは初期重心によって局所解が変わります。クラスタへ画素が1つも割り当てられない場合の 処理も必要です。実装を読むときは、収束条件、初期化、空クラスタの扱いを確認します。

k-meansの反復を実装する

1回の反復は、各データを最も近い重心へ割り当てるステップと、クラスタ内の平均で重心を更新する ステップから成ります。データ数をN、クラスタ数をK、次元数をD、反復回数をIとすると、 おおよその計算量はO(I × N × K × D)です。

重心の移動量が許容値未満になったら終了し、最大反復回数も設定します。所属ラベルが変わらなくなる ことを収束条件にしても構いません。浮動小数点の重心を毎回整数へ丸めると早く停滞するため、 計算中は小数のまま保持し、表示時だけ丸めます。

初期化と再現性

完全な乱択より、互いに離れた初期重心を選びやすいk-means++を使うと悪い局所解を減らせます。 比較実験では乱数シードを固定し、複数シードの最終誤差も記録します。

空クラスタが生じた場合は、最も誤差の大きい点を新しい重心にする、既存重心から離れた点を選ぶ、 そのクラスタを維持する、などの方針があります。どの方法でも無言でNaNを作らないことが重要です。

画像減色ではRGBの距離が知覚上の色差と一致しない場合があります。結果を発展させるならLab色空間で クラスタリングし、RGBへ戻して表示する方法も比較できます。

おすすめの記事

最新の記事

著者について

404

s-yoshiki

ただの備忘録です。

※外部送信に関する公表事項