【问题标题】:OpenCV set color to a foreground marked pixel GC_PR_FGDOpenCV 将颜色设置为前景标记的像素 GC_PR_FGD
【发布时间】:2012-09-30 09:31:13
【问题描述】:

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

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

我该怎么做?

谢谢!!

【问题讨论】:

    标签: ios image-processing opencv pixels foreground


    【解决方案1】:

    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;
            }
        }
    }
    

    【讨论】:

    • 您好 Bob,首先感谢您快速回答。我稍微修改了你的代码。我添加了 binaryImage.at(i,j) = 255;在“if”中,因为您在没有 (i,j) 的情况下编写此代码,但代码不起作用。在运行时永远不要进入“如果”...
    • 嗨鲍勃!终于成功了!之前我在做 cv::compare(output,cv::GC_PR_FGD,output,cv::CMP_EQ);将标志 GC_PR_FGD 移除到每个像素。如果我评论此操作,您的代码将有效!非常感谢鲍勃!
    • @m4rkit0z 你说得对,我实际上忘记了循环内的ij!马上修好。很高兴它帮助了你
    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 2022-11-30
    • 2021-10-28
    相关资源
    最近更新 更多