Ich habe ein Bild mit einem orangefarbenen und einem weißen Hintergrund. Ich möchte den weißen Hintergrund transparent machen. Der folgende Code verwendet Grabcut, um eine Maske zu erstellen. Ich teile dann das Bild in rgb-Kanäle auf und lege die Maske auf den Alpha-Kanal an. Sie sehen auf den Bildern unten, dass Post-Grabcut- und Mask-Bilder in Ordnung sind. Ich konnte nicht herausfinden, wie man die Maske auf den Alpha-Kanal anwendet. Vorschläge geschätzt.Machen Sie ein Bild Hintergrund transparent
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)
Mein ursprünglicher Code war korrekt und Maske * 255 ist nicht erforderlich. Das Problem war, dass imshow keine Alpha-Kanäle unterstützt, wie Sie richtig angemerkt haben. Möchten Sie Ihre Antwort bearbeiten und ich akzeptiere? – gobob
Ich machte die Änderungen, froh, dass einige der Informationen für Sie hilfreich waren @gobob – andrew