背景: 我有2组来自图像的颜色像素,一组对应于背景,另一组对应于前景。接下来,我使用 OpenCV 的 EM 为每组训练 2 个高斯混合模型。我的目标是找出随机像素属于前景和背景的概率。因此,我对像素上的每个 EM 使用“预测”函数。
问题:
- 我不明白这个函数返回的值。在 OpenCV 的文档中是这样写的:
该方法返回一个二元素双精度向量。零元素是样本的似然对数值。第一个元素是给定样本最可能的混合成分的索引。
我不明白“似然对数”是什么意思。在我的结果中,我有时会有负值和值 > 1。是否有人使用相同的函数有这种结果或结果在 0 和 1 之间?我可以从我的结果中得出什么结论?
- 如何获得像素属于整个 GMM 的概率(而不是属于 GMM 的每个集群的概率)?
这是我的代码:
Mat mask = imread("mask.tif", 0);
Mat formerImage = imread("ImageFormer.tif");
Mat currentImage = imread("ImageCurrent.tif");
// number of cluster in the GMM
int nClusters = 5;
int countB=0, countF=0;
Vec3b color;
Vec2d probFg, probBg; // probabilities to belong to the foreground or background from GMMs
//count the number of pixels for each training data
for(int c=0; c<=40;c++) {
for(int l=0; l<=40;l++) {
if(mask.at<BYTE>(l, c)==255) {
countF++;
} else if(mask.at<BYTE>(l, c)==0) {
countB++;
}
}
}
printf("countB %d countF %d \n", countB, countF);
Mat samplesForeground = Mat(countF,3, CV_64F);
Mat samplesBackground = Mat(countB,3, CV_64F);
// Expectation-Maximisation able to resolve the GMM and to predict the probability for a pixel to belong to the GMM.
EM em_foreground= EM(nClusters);
EM em_background= EM(nClusters);
countB=0;
countF=0;
// fill the training data from the former image depending of the mask
for(int c=0; c<=40;c++) {
for(int l=0; l<=40;l++) {
if(mask.at<BYTE>(l, c)==255) {
color = formerImage.at<Vec3b>(l, c);
samplesForeground.at<double>(countF,0)=color[0];
samplesForeground.at<double>(countF,1)=color[1];
samplesForeground.at<double>(countF,2)=color[2];
countF++;
} else if(mask.at<BYTE>(l, c)==0) {
color = formerImage.at<Vec3b>(l, c);
samplesBackground.at<double>(countB, 0)=color[0];
samplesBackground.at<double>(countB, 1)=color[1];
samplesBackground.at<double>(countB, 2)=color[2];
countB++;
}
}
}
printf("countB %d countF %d \n", countB, countF);
em_foreground.train(samplesForeground);
em_background.train(samplesBackground);
Mat sample(1, 3, CV_64F);
// try every pixel of the current image and get the log likelihood
for(int c=0; c<=40;c++) {
for(int l=0; l<=40;l++) {
color = currentImage.at<Vec3b>(l,c);
sample.at<double>(0)=color[0];
sample.at<double>(1)=color[1];
sample.at<double>(2)=color[2];
probFg=em_foreground.predict(sample);
probBg=em_background.predict(sample);
if(probFg[0]>0 || probBg[0]>0)
printf("probFg[0] %f probBg[0] %f \n", probFg[0], probBg[0]);
}
}
编辑
在@BrianL 解释之后,我现在了解了对数可能性。
我的问题是预测函数的对数概率有时> 0。但它应该 <= 0。有没有人遇到过这个问题?
我已经编辑了上面的代码来显示问题。我已经尝试了以下图片的程序:
第一个图像是 ImageCurrent.tif,第二个是 ImageFormer.tif,最后一个是 mask.tif。
这可以被认为是 OpenCV 中的错误吗?我应该在 OpenCV 错误跟踪器上开票吗?