0

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

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

我怎样才能做到这一点?

谢谢!!

4

1 回答 1

1

cv::grabCut 文档中,您似乎可以获得具有以下值的掩码作为输出:

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

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

例如,假设您已经得到 acv::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;
        }
    }
}
于 2012-10-10T04:22:13.943 回答