2016-08-02 359 views
1

我有一個圖像,橙色和白色背景。我想讓白色背景變得透明。下面的代碼使用grabcut來製作一個面具。然後,我將圖像分割成RGB通道並在Alpha通道上應用蒙版。您會從下面的圖片中看到,後期截取和遮罩圖片都可以。我一直無法弄清楚如何將遮罩應用於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) 

originalpost-grabcutmaskfinal

回答

1

根據舊的SO問題,imshow實際上並不支持Alpha通道http://jepsonsblog.blogspot.com/2012/10/overlay-transparent-image-in-opencv.html但是這是舊的文章和支持MAY已被添加,但我不知道肯定

+0

我原來的代碼是正確的,掩碼* 255不是必需的。問題出在您正確指出的imshow不支持alpha通道。你想編輯你的答案,我會接受嗎? – gobob

+0

我做了更改,很高興看到一些信息對您有幫助@gobob – andrew