2015-06-25 9 views
1

Учитывая гистограмму я хочу обучить гауссовую смесь Модель:OpenCV Gaussian смесь Модель гистограммы

int calcGMMThreshold(cv::Mat & hist, cv::Mat & labels){ 

    cv::Mat samples(hist.rows,2, CV_32FC1); // for building 2 dim samples 

    // output variables 
    cv::Mat probs, log_likelihoods; 

    // building 2 dimensional Mat -->[value][#value] 
    for(int i = 0; i<hist.rows; i++) 
    { 
     samples.at<float>(i,0) = (float)i; 
     samples.at<float>(i,1) = hist.at<float>(i); 
    } 

    assert(samples.cols == 2); 
    assert(samples.rows == 256); 

    ///set up gmm 

    //gmm object with 3 gmms 
    cv::EM gmm(3); 


    /*train gmms*/ 
    gmm.train(samples, log_likelihoods, labels, probs); 

} 

Когда я plot гистограммы с этикетками для меня это выглядит, что мои ГММ отдельные абсолютные значения и не 2-мерный вход.

Я бы ожидал 3 гауссианов со своими средствами на каждом пике гистограммы.

+0

Вы уверены, что хотите обучить 2D gmm? не ваши данные 1D? – BeyelerStudios

+0

Я хочу получить куски интенсивностей. Я думаю, что результат, который я построил, - это 1d gmm? Так что это не то, что я хочу. – TheLearingGuy

+0

Это правда, что для построения гистограммы требуются метки, то есть ведра гистограммы. Но gmm в вашем примере «видит» набор 2D-данных (метка + значение) и аппроксимирует 2D-гауссовские распределения на них, нет? Вы должны делать gmm только по значениям. – BeyelerStudios

ответ

0

Для вычисления модели гауссовой смеси используйте фактические данные изображения, а не гистограмму, как указано в приведенном выше коде.

Смежные вопросы