2016-08-31 14 views
0

centresがkmeansにあるもの、特にOpenCVのkmeans()の機能を理解するのが難しいです。Kmeans:データ座標のラベルと出力中心は何ですか?

私はkmeansがデータサンプルでk個のクラスタを見つけることを理解します。そして、centresパラメータは私に各クラスタの中心/重心を教えてくれます。 `センターはが6行を持つべきではありません(1 -

しかしは、ラベル私はそれは私が2行3列を持っているが、私は6つのクラスタと関数kmeansを走った私のcentresを検査しようとしたときに何をしています各クラスタについて)最後に、中心点の値を検査することは浮動小数点値を出力しています - インデックス(ints)であってはなりませんか?データサンプル配列のインデックスと同じです。

kmeansを実行した後、(データ座標の)クラスタセンターをどのように取得できますか?最終的に私は最も一般的な色を見つけようとしています - それで、私の想定しているクラスターセンターは、自分のマットタイプに応じてBGR/HSV/Lab値になると思いますか?

kmeans(collapsedImage, 6, labels, 
    TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 
    3, KMEANS_PP_CENTERS, centres); 


printf("rows: %d, cols: %d", centres.rows, centres.cols); 
// outputs 'rows : 2, cols : 3' 

for (int i = 0; i < centres.rows; i++) { 
    for (int j = 0; j < centres.cols; j++) { 
     std::cout << centres.at<float>(i, j) << " "; 
    } 

    std::cout << std::endl; 
} 

// Outputs: Why are these floats??? 
// 1.48938 0.578623 0.464539 
// 242.628 131.947 80.5347 
+1

たぶん私はすでに[これにあなたを指摘](http://stackoverflow.com/a/34734939/5008845)および[this](http://stackoverflow.com/a/35482205/5008845)を参照してください。 2番目のリンクはおそらくまさにあなたがやろうとしているものです。しかし:1)ええ、wierd。行は6でなければなりません。 2) 'centres'はクラスタ中心の座標を含む。彼らはフロートです。 'centres'の行は' labels'の整数値に対応します。 – Miki

+0

@Miki整数値に対応する中心の行について最後のビットを展開できますか?セントラルから1つのクラスタ中心を検索する方法の例 –

+1

入力イメージのサイズは 'rows x cols x 3'(3 =カラーイメージ)です。 'kmeans'に送るデータは' N×3'です( 'N =行*列')。 'labels 'は' Nx1'というサイズのインデックス(整数値)の行列で、各インデックスは '0 <= index Miki

答えて

0

[OK]を@Mikiが何であるかをラベル説明し、以下の(私はこれが正しいと確信している)クラスタ中心を取得する方法を解決したので:

printf("cols: %d, rows: %d", centres.cols, centres.rows); 
int x = 0; 
for (int i = 0; i < centres.rows; i++) { 

    Vec3b s(centres.at<float>(i, 0), centres.at<float>(i, 1), centres.at<float>(i, 2)); 
    std::cout << "Dominant Colour (aka Cluster centre?): " << s << std::endl; 

    rectangle(image, Rect(x, 10, 10, 10), s, 3, 0); 
    x += 22; 
} 
関連する問題