更改cvGrabCut()c#获得的前景图像的背景色

本文关键字:图像 背景色 cvGrabCut 更改 | 更新日期: 2023-09-27 18:28:56

我使用了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");

更改cvGrabCut()c#获得的前景图像的背景色

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

查看此处文档

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

行,cols=输出。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#中执行类似操作。