我使用cv::grabCut从图像中提取对象。运行良好。

现在,将对象放置在没有背景的单独Mat中,并且我想为整个对象设置黑色。我想为所有标有GC_PR_FGD的像素(前景像素)设置黑色。

我怎样才能做到这一点?

谢谢!!

最佳答案

cv::grabCut documentation看来,您可以使用以下值作为掩码的输出:

  • GC_BGD当然是背景像素
  • GC_FGD当然是前景(对象)像素
  • GC_PR_BGD可能是背景像素
  • GC_PR_FGD可能是前景像素

  • 我假设您想要一个背景为白色,前景为黑色的图像。在这种情况下,您可以创建一个新矩阵,并在遍历蒙版像素时,根据蒙版像素值为该矩阵分配0或1(或255)。

    例如,假设您已将cv::Mat mask作为算法的结果,则执行类似的操作(警告,我尚未编译,这是近似的):
    cv::Mat binaryImage = zeros(mask.rows, mask.cols, CV_8U);
    
    for (int i==0; i<mask.rows; ++i){
        for (int j==0; j<mask.cols; ++j){
            // choose pixels that are certainly or likely background
            if (mask.at<uchar>(i,j) == GC_BGD || mask.at<uchar>(i,j) == GC_BGD){
                binaryImage.at<uchar>(i,j) = 255;
            }
        }
    }
    

    10-05 18:28
    查看更多