2016-11-10 3 views
5

Я пытаюсь удалить черный фон из вывода grabcut с помощью python opencv.Удаление черного фона и сделать прозрачным из вывода grabcut в python open cv

import numpy as np 
import cv2 

img = cv2.imread(r'myfile_1.png') 
mask = np.zeros(img.shape[:2],np.uint8) 

bgdModel = np.zeros((1,65),np.float64) 
fgdModel = np.zeros((1,65),np.float64) 

rect = (1,1,665,344) 
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) 

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') 
img = img*mask2[:,:,np.newaxis] 

cv2.imshow('img',img) 
cv2.imwrite('img.png',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Выше кода, который я написал для сохранения вывода grabcut. Пожалуйста, предложите, как я могу удалить черный фон и сделать его прозрачным?

enter image description here

enter image description here

+1

Все что вам нужно, это добавить альфа-канал с передним планом к изображению. На это ранее был дан ответ: http://stackoverflow.com/questions/35886307/how-to-make-white-part-of-the-image-transparent-by-using-android-opencv – masad

+0

Спасибо, Масад. Ты спас свой день. –

ответ

14

Я достиг этого, используя следующий фрагмент кода.

import cv2 
file_name = "grab.png" 

src = cv2.imread(file_name, 1) 
tmp = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) 
_,alpha = cv2.threshold(tmp,0,255,cv2.THRESH_BINARY) 
b, g, r = cv2.split(src) 
rgba = [b,g,r, alpha] 
dst = cv2.merge(rgba,4) 
cv2.imwrite("test.png", dst) 

enter image description here

2

Это Java-код. После использования grabcut, исходный фон прозрачен.

public Bitmap removeBackground(Bitmap bitmap) { 
    //GrabCut part 
    Mat img = new Mat(); 
    Utils.bitmapToMat(bitmap, img); 

    int r = img.rows(); 
    int c = img.cols(); 
    Point p1 = new Point(c/100, r/100); 
    Point p2 = new Point(c - c/100, r - r/100); 
    Rect rect = new Rect(p1, p2); 

    Mat mask = new Mat(); 
    Mat fgdModel = new Mat(); 
    Mat bgdModel = new Mat(); 

    Mat imgC3 = new Mat(); 
    Imgproc.cvtColor(img, imgC3, Imgproc.COLOR_RGBA2RGB); 

    Imgproc.grabCut(imgC3, mask, rect, bgdModel, fgdModel, 5, Imgproc. 
      GC_INIT_WITH_RECT); 

    Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0)); 
    Core.compare(mask, source/* GC_PR_FGD */, mask, Core.CMP_EQ); 

    //This is important. You must use Scalar(255,255, 255,255), not Scalar(255,255,255) 
    Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 
      255, 255,255)); 
    img.copyTo(foreground, mask); 

    // convert matrix to output bitmap 
    bitmap = Bitmap.createBitmap((int) foreground.size().width, 
      (int) foreground.size().height, 
      Bitmap.Config.ARGB_8888); 
    Utils.matToBitmap(foreground, bitmap); 
    return bitmap; 
} 
Смежные вопросы