使图像背景透明
Make an image background transparent
我有一张带有橙色和白色背景的图片。我想让白色背景透明。下面的代码使用 grabcut 制作遮罩。然后我将图像拆分为 rgb 通道并在 alpha 通道上应用蒙版。您将从下面的图像中看到 post-grabcut 和 mask 图像都可以。我还没弄清楚如何将蒙版应用到 alpha 通道。赞赏建议。
im = cv2.imread(sourceimagefile)
cv2.imshow('original',im)
mask = np.zeros(im.shape[:2],np.uint8)
rect = (box[0][0], box[0][1], box[0][2]-box[0][0], box[0][3]-box[0][1])
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
cv2.grabCut(im,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
if len(np.where((mask==3)|(mask==1))[0])>0:
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
mask2 = np.repeat(mask2[:,:,np.newaxis],3,axis=2)
else:
mask2 = np.zeros_like(im)
mask2[box[0][1]:box[0][3],box[0][0]:box[0][2],:] = 1
im2 = im*mask2
cv2.imshow('post-grabcut',im2)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(mask)
flag, mask = cv2.threshold(mask, maxVal-1, 255, cv2.cv.CV_THRESH_BINARY)
cv2.imshow("mask", mask)
b, g, r = cv2.split(im2)
img_RGBA = cv2.merge((b, g, r, mask))
cv2.imshow("final",img_RGBA)
根据一个较旧的 SO 问题,imshow 实际上不支持 alpha 通道 http://jepsonsblog.blogspot.com/2012/10/overlay-transparent-image-in-opencv.html 但这是一个旧的 post 并且支持 MAY 已经已添加,但我不确定
我有一张带有橙色和白色背景的图片。我想让白色背景透明。下面的代码使用 grabcut 制作遮罩。然后我将图像拆分为 rgb 通道并在 alpha 通道上应用蒙版。您将从下面的图像中看到 post-grabcut 和 mask 图像都可以。我还没弄清楚如何将蒙版应用到 alpha 通道。赞赏建议。
im = cv2.imread(sourceimagefile)
cv2.imshow('original',im)
mask = np.zeros(im.shape[:2],np.uint8)
rect = (box[0][0], box[0][1], box[0][2]-box[0][0], box[0][3]-box[0][1])
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
cv2.grabCut(im,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
if len(np.where((mask==3)|(mask==1))[0])>0:
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
mask2 = np.repeat(mask2[:,:,np.newaxis],3,axis=2)
else:
mask2 = np.zeros_like(im)
mask2[box[0][1]:box[0][3],box[0][0]:box[0][2],:] = 1
im2 = im*mask2
cv2.imshow('post-grabcut',im2)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(mask)
flag, mask = cv2.threshold(mask, maxVal-1, 255, cv2.cv.CV_THRESH_BINARY)
cv2.imshow("mask", mask)
b, g, r = cv2.split(im2)
img_RGBA = cv2.merge((b, g, r, mask))
cv2.imshow("final",img_RGBA)
根据一个较旧的 SO 问题,imshow 实际上不支持 alpha 通道 http://jepsonsblog.blogspot.com/2012/10/overlay-transparent-image-in-opencv.html 但这是一个旧的 post 并且支持 MAY 已经已添加,但我不确定