简介
本文主要介绍如何使用python来抠图,及抠图的基本原理
效果图
图片 | |
---|---|
原图 | |
效果图 |
原理
- 首先要选定要抽取对象的区域,区域外的部分为背景
- 基于选定区域,grabCut循环处理前景内容
- 前景部分含有的背景(抽取对象外)部分,并不能很好处理。
代码
import cv2
import numpy as np
fname = 'images/test1.jpg'
img = cv2.imread(fname)
rect = (275, 120, 170, 320)
mask = np.zeros(img.shape[:2], np.uint8)
bgModel = np.zeros((1,65), np.float64)
fgModel = np.zeros((1,65), np.float64)
cv2.grabCut(img, mask, rect, bgModel, fgModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype(np.uint8)
out = img * mask2[:, :, np.newaxis]
cv2.imshow('output', out)
cv2.waitKey()
感言
- 选定区域的width, height, x, y等参数的确定比较麻烦,且对结果影响较大
- 当抽取不连续对象时,区域要包含所有对象
- 当grabCut不能很好区分对象时,需要人工标记前景/背景部分。这时需要用到
cv2.GC_INIT_WITH_MASK
参数 - 有兴趣的朋友可以设计一个在线抠图工具
- 上传图片
- 选定区域
- 标记前景部分
- 标记背景部分
- 下载图片