【问题标题】:Changing background color of foreground image obtained by cvGrabCut() c#更改通过 cvGrabCut() c# 获得的前景图像的背景颜色
【发布时间】:2016-07-29 20:05:23
【问题描述】:

我在 c# 中使用 emgu cv 中的 cvGrabCut() 方法来提取前景图像。结果令人满意,我可以提取黑色背景的前景图像。但是现在我必须将获得的黑色背景图像更改为一些不同的颜色。我怎样才能做到这一点?我使用以下代码进行前景提取:

mask1.Draw(rect, new Gray(3), 0);
//the models (internally used)
Matrix<double> bgModel = new Matrix<double>(1, 13 * 5);
Matrix<double> fgModel = new Matrix<double>(1, 13 * 5);
//initialization with mask
CvInvoke.CvGrabCut(image.Ptr, mask1.Ptr, ref rect, bgModel.Ptr, fgModel.Ptr, 10, Emgu.CV.CvEnum.GRABCUT_INIT_TYPE.INIT_WITH_MASK);
//GrabCut segmentation
CvInvoke.CvGrabCut(image.Ptr, mask1.Ptr, ref rect, bgModel.Ptr, fgModel.Ptr, 15, Emgu.CV.CvEnum.GRABCUT_INIT_TYPE.EVAL);
//Get the pixels marked as likely foreground
mask1 = mask1.And(new Gray(1));
Image<Bgr, Byte> result = image.Copy(mask1);
result.Save("foreground.jpg");

【问题讨论】:

    标签: c# emgucv


    【解决方案1】:

    从文档看来,您应该将“new Gray(n)”中的一个或两个更改为“new Bgr(b,g,r)”,其中字符分别为蓝色、绿色和红色(如在反向 RGB 中)。

    看这里Documentation

    【讨论】:

    • 注意:我不确定应该更改哪个 'new Gray(n)',因此您需要进行一些测试
    • 我尝试将蒙版图像从 gray 更改为 Bgr ,但复制方法给我错误: Image result = image.Copy(mask1);因为 mask1 图像应始终为 类型
    【解决方案2】:

    从grabcut获得结果后,您可以遍历图像并检查3通道(RGB)中的黑色像素。只需替换那些检测到的黑色像素的相应颜色值。 示例:

    rows,cols = output.shape[:2]

    b,g,r = cv2.split(output)
        for i in range(rows):
            for j in range(cols):
                if(r[i, j] == 0 and g[i, j] == 0 and b[i, j] == 0):
                    r[i, j] = 255
                    g[i, j] = 255
                    b[i, j] = 255
    

    在这里,我正在从黑色变为白色。但是这段代码是在 python 中的。你可以在 c# 中做类似的事情。

    【讨论】:

      猜你喜欢
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多