【问题标题】:Make an image background transparent使图像背景透明
【发布时间】:2016-12-08 07:23:54
【问题描述】:

我有一张橙色和白色背景的图片。我想让白色背景透明。下面的代码使用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)

【问题讨论】:

    标签: python opencv image-processing computer-vision transparency


    【解决方案1】:

    根据一个较早的 SO 问题,imshow 实际上并不支持 alpha 通道 http://jepsonsblog.blogspot.com/2012/10/overlay-transparent-image-in-opencv.html 但这是一个旧帖子,并且支持可能已添加,但我不确定 p>

    【讨论】:

    • 我的原始代码是正确的,不需要掩码*255。正如您正确指出的那样,问题在于 imshow 不支持 alpha 通道。你想编辑你的答案,我会接受吗?
    • 我做了更改,很高兴其中一些信息对您有帮助@gobob
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多