【发布时间】: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<float>(b)/S样本(b的副本)以及从样本索引到b的映射。 3. 执行 1D gmm 并将生成的标签映射到b。
标签: opencv