在GrabCut算法中会发生什么

时间:2013-11-20 00:33:51

标签: c++ opencv image-processing

我想知道以下代码中实际上有什么好处。

cv::Rect rectangle(x,y,width,height);

    cv::Mat result; 
    cv::Mat bgModel,fgModel;


    cv::grabCut(image,  
                    result,  
                    rectangle,
                    bgModel,fgModel, 
                    1,       
                    cv::GC_INIT_WITH_RECT);


    cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);

    // Generate output image
    cv::Mat foreground(image.size(),CV_8UC3,cv::Scalar(255,255,255));
    image.copyTo(foreground,result); 

根据我的知识,当我们定义矩形外面的矩形将被视为已知背景而内部将被视为未知前景。

然后bgmodelfgmodel是高斯混合模型,它们分别保留前景和背景像素。

我们传递的参数为1意味着,我们要求将像素划分为单独的像素进程只运行一次。

我无法理解的是

cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);

上述方法实际发生了什么。

如果有人能解释,那将是一个很大的帮助。 感谢名单。

1 个答案:

答案 0 :(得分:2)

我发现this book表示此代码会比较resultGC_PR_FGD值的像素值。那些相等的它不会触及它所删除的所有其他像素。这是一个引用:

  

输入/输出分割图像可以具有以下四个值之一:

     
      
  • cv :: GC_BGD,用于当前属于背景的像素(例如,我们示例中矩形外的像素)
  •   
  • cv :: GC_FGD,对于肯定属于前景的像素(在我们的示例中没有)
  •   
  • cv :: GC_PR_BGD,对于可能属于背景的像素
  •   
  • cv :: GC_PR_FGD可能属于前景的像素(也就是我们矩形内部像素的初始值)   例子)。
  •   
     

我们通过提取像素获得分割的二进制图像   值等于cv :: GC_PR_FGD:

// Get the pixels marked as likely foreground
cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
// Generate output image
cv::Mat foreground(image.size(),CV_8UC3,
                cv::Scalar(255,255,255));
image.copyTo(foreground, // bg pixels are not copied
          result);