# 利用GrabCut算法从图像中分离出前景
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('meixi.jpg')
mask = np.zeros(img.shape[:2],np.uint8)
# 用于润色图像的mask
newmask = cv.imread('m_mask.png',0)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
# 前景位于矩形中
rect = (50,50,450,290)
# 应用GrabCut算法的 GC_INIT_WITH_RECT 分离方法
cv.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv.GC_INIT_WITH_RECT)
# 将可能的前景置为 1 ,可能的背景置为 0 。
mask = np.where((mask==2) | (mask==0),0,1).astype('uint8')
# 进行图像润色,对不合理的划分通过手动设计 mask 划分
mask[newmask == 0] = 0
mask[newmask == 255] = 1
img = img * mask[:,:,np.newaxis]
plt.imshow(img)
plt.show()
有不懂的地方请参考官方文档:
https://docs.opencv.org/4.1.0/d8/d83/tutorial_py_grabcut.html