kmeans сегментация в OpenCV

Известен подход к сегментации с использованием алгоритма kmeans, и я тоже решил его попробовать. Материал нашел здесь.
Переделал код под версию 2.4.1, который вы можете видеть ниже
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

using namespace cv;
using namespace std;

int main() 
{
    Mat src = imread("lena.jpg");
    imshow("original", src);

    // Размытие
    blur(src, src, Size(15,15));	
    imshow("blurred", src);

    Mat p = Mat::zeros(src.cols*src.rows, 5, CV_32F);
    Mat bestLabels, centers, clustered;

    // Перевод в нужный формат
    vector<Mat> bgr(3);
    split(src, bgr);    
    for(int i=0; i<src.cols*src.rows; i++) {
        p.at<float>(i,0) = (i/src.cols) / src.rows;
        p.at<float>(i,1) = (i%src.cols) / src.cols;
        p.at<float>(i,2) = bgr[0].data[i] / 255.0;
        p.at<float>(i,3) = bgr[1].data[i] / 255.0;
        p.at<float>(i,4) = bgr[2].data[i] / 255.0;
    }

    // Kmeans в действии
    int K = 8;
    cv::kmeans(p, K, bestLabels,
            TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),
            3, KMEANS_PP_CENTERS);


( Читать дальше )

Метод k-средних в OpenCV

k-means (метод k-средних) – алгоритм кластеризации. Суть в том, что в группе данных найти скопления («кластеры»). Пользователь устанавливает количество кластеров, а алгоритм находит лучшие места для них.
Алгоритм работает следующим образом.
1. Входные данные: (а) набор данных; (б) количество кластеров.
2. Случайно назначаем позиции кластеров.
3. Связываем каждую точку данных с ближайшим центром.
4. Перемещение центра кластера в позицию «центра тяжести».
5. Возврат к шагу 3 до тех пор, пока на шаге 4 не будет изменений.
Не смотря на то, что данный алгоритм является эффективным, у него есть три проблемы:
1. Не гарантируется, что найдется оптимальное местоположение кластеров, однако гарантируется сходимость алгоритма (нет бесконечного движения центров).
2. Метод k-средних не скажет нам, какое оптимальное количество кластеров – их необходимо устанавливать самостоятельно.
3. Метод k-средних предполагает, что ковариация в пространстве или не имеет значения, или данные уже нормализованы.

( Читать дальше )