概要
OpenCV で k 平均法 (k-means) を使って、画像の代表色を取得する方法を紹介します。
cv2.kmeans
引数
名前 | 型 | デフォルト値 |
---|---|---|
data | ndarray | |
入力データ。形状が (M, N) の numpy 配列。 | ||
K | int | |
クラスタ数 | ||
criteria | list of int | |
アルゴリズムの終了条件 | ||
attempts | int | |
k 平均法を何回実行するか | ||
flags | int | |
アルゴリズムに関するフラグ |
返り値
名前 | 説明 | ||
---|---|---|---|
retval | compactness measure の値 | ||
bestLabels | 各サンプルに割り当てられたクラスタ | ||
centers | クラスタの中心の一覧 |
criteria
criteria は最大反復回数及び移動量の閾値を 2 通りの方法で指定します。
- 最大反復回数: 反復回数がこの値に達した場合、アルゴリズムを終了する
- 移動量の閾値: 各反復でクラスタの中心を移動するが、この移動量が閾値未満になった場合はアルゴリズムを終了する
attempts
最初、クラスタの中心は適当な点で初期化されるので、アルゴリズムの結果は毎回異なります。attempts
に 2 以上の値を指定した場合、アルゴリズムをその回数分実行し、compactness measure の値が最小となる結果、つまり、最良の結果を返します。
retval
サンプルとそのサンプルが属するクラスタの中心との 2 乗距離になります。
サンプルを としたとき、
画像の代表色を取得する
画像で使われているすべての色に対して、 平均法を適用し、代表色を 色取得します。

In [1]:
ret: 131459173.92, label: (140500, 1), center: (5, 3)
- labels は各サンプルが割り当てられたクラスタを表す (NumSamples, 1) の numpy 配列
- centers はクラスタの中心点を表す (K, M) の numpy 配列
例えば、 番目のサンプルが割り当てられたクラスタの中心点を取得したい場合は、centers[labels[i]]
とします。
In [2]:

画像の各画素をクラスタの色で置き換える
In [3]:

コメント