1

이미지에 오렌지색과 흰색 배경이 있습니다. 흰색 배경을 투명하게 만들고 싶습니다. 아래 코드는 마스크를 만들기 위해 grabcut을 사용합니다. 그런 다음 이미지를 RGB 채널로 분할하고 알파 채널에 마스크를 적용합니다. 아래의 그림에서 그라우트 후 사진과 마스크 이미지는 정상적으로 보입니다. 마스크를 알파 채널에 적용하는 방법을 알 수 없었습니다. 제안을 감사드립니다.이미지 배경을 투명하게 만듭니다.

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 실제로 알파 채널 http://jepsonsblog.blogspot.com/2012/10/overlay-transparent-image-in-opencv.html을 지원하지 않지만이 추가되었습니다 이전 게시물 및 지원 입니다,하지만 난하지 않습니다 알아 정확히

+0

원본 코드가 정확하고 마스크 * 255는 필요하지 않습니다. 문제는 정확하게 지적한 것처럼 imshow가 알파 채널을 지원하지 않는 데있었습니다. 답변을 수정 하시겠습니까? 동의하겠습니다. – gobob

+0

일부 정보가 도움이 되서 기뻤습니다. @gobob – andrew