♥
import cv2
import numpy as np
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png')
mask=np.zeros(img.shape[:2],np.uint8)#定义原始掩模
bg=np.zeros((1,65),np.float64)
fg=np.zeros((1,65),np.float64)
rect=(100,100,200,400)#根据原图设置包含前景的矩形大小
cv2.grabCut(img,mask,rect,bg,fg,5,cv2.GC_INIT_WITH_RECT)#第1次提取前景,矩形模式
imgmask=cv2.imread('C:/Users/xpp/Desktop/Lenas.png')#读取已标注的掩模图像
cv2.imshow('mask image',imgmask)
mask2=cv2.cvtColor(imgmask,cv2.COLOR_BGR2GRAY,dstCn=1)
#根据掩模图像,将掩模图像中白黑色像素对应的原始掩模像素设置为0
mask[mask2==0]=0
#根据掩模图像,将掩模图像中白色像素对应的原始掩模像素设置为1
mask[mask2==255]=1
cv2.grabCut(img,mask,None,bg,fg,5,cv2.GC_INIT_WITH_MASK)#第2次提取前景,掩模模式
mask2=np.where((mask==2)|(mask==0),0,1).astype('uint8')
img=img*mask2[:,:,np.newaxis]#将掩模与原图像相乘获得分割出来的前景图像
cv2.imshow('grabCut',img)#显示获得的前景
cv2.waitKey(0)
算法:交互式前景提取是首先用矩形框指定要提取的前景所在的大致范围,接着执行前景提取算法得到初步结果。然后,用户复制原图像作为掩模图像,用白色标注要提取的前景区域,用黑色标注背景区域。最后,使用掩模图像执行前景提取算法从而获得理想的提取结果。
文献:Rother, C. . (2004). Grabcut : interactive foreground extraction using iterated graph cuts. Proceedings of Siggraph, 23.
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!