2016-01-04 2 views
1

Я использовал метод cvGrabCut() из emgu cv в C#, чтобы извлечь изображение переднего плана. Результат удовлетворительный, и я могу извлечь изображение переднего плана с черным фоном. Но теперь мне нужно изменить полученный черный цвет фона на другой цвет. Как я могу это сделать? Я использовал следующий код для извлечения переднего плана:Изменение цвета фона переднего плана, полученного cvGrabCut() C#

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"); 

ответ

1

Из документации он выглядит, как вы должны изменить один или оба из «нового Грея (п)» с «новым BGR (б, г, г) ', где символы соответственно синие, зеленые и красные (как в обратном RGB).

Посмотрите здесь Documentation

+0

Примечание: Я не уверен, какой «новый серый (n)» должен быть изменен, поэтому вам нужно будет провести некоторое тестирование. – RedLaser

+0

Я попытался изменить изображение маски с серого на Bgr, но метод копирования дает мне ошибку: Изображение result = image.Copy (mask1); Поскольку изображение mask1 должно быть всегда типа

0

После получения результата от grabcut, вы можете перемещаться по изображению и проверить черные пиксели в 3-х каналах (RGB). Просто замените соответствующие значения цвета для обнаруженных черных пикселей. Пример:

строки, перевалы = 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#.

Смежные вопросы