更改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");
从文档中看,您应该将"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#中执行类似操作。