【问题标题】:OpenCV Gaussian Mixture Model of histogram直方图的OpenCV高斯混合模型
【发布时间】:2015-09-12 00:09:07
【问题描述】:

给定一个直方图,我想训练一个高斯混合模型:

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 带有标签的直方图时,看起来我的 gmms 将绝对值而不是二维输入分开。

我预计直方图的每个峰值都有 3 个高斯分布。

【问题讨论】:

  • 您确定要训练 2D gmm 吗?你的数据不是一维数据吗?
  • 我想得到强度的块。我认为我绘制的结果是 1d gmm?所以这不是我想要的。
  • 这是真的,绘制直方图需要它的标签,即直方图的桶。但是您示例中的 gmm “看到”了一组 2D 数据(标签 + 值)并在它们上近似 2D 高斯分布,不是吗?您应该只对值执行 gmm。
  • 实际上,如果我理解正确,您正在尝试对存储桶的标签进行 gmm 并通过直方图的值对它们进行加权,在这种情况下,您的样本是值 0 到 hist.rows你的权重是 hist 的值
  • 你可以像这样测试它(我在 opencv 中没有看到加权 gmm): 1. 定义采样率 S(比如 1000)。 2. 为每个b=0..hist.rows-1 生成hist.at&lt;float&gt;(b)/S 样本(b 的副本)以及从样本索引到b 的映射。 3. 执行 1D gmm 并将生成的标签映射到b

标签: opencv


【解决方案1】:

要计算高斯混合模型,请使用实际图像数据,而不是上面代码中预期的直方图。

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2021-09-30
    • 2012-09-11
    • 2023-03-24
    • 2014-01-09
    • 2012-05-08
    • 1970-01-01
    • 2018-07-19
    • 2013-06-11
    相关资源
    最近更新 更多