2016-11-10 16 views
5

Próbowałem usunąć czarne tło z obrazu wyjściowego przy użyciu Pythona opencv.Usunięcie czarnego tła i uczynienie przezroczystym z pobranego obrazu w pythonie otwórz 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() 

Powyższy kod, który napisałem, aby zapisać wyjście do przechwytywania. Proszę zasugerować, w jaki sposób mogę usunąć czarne tło i uczynić je przezroczystym?

enter image description here

enter image description here

+1

Wszystko, czego potrzebujesz, to dodanie kanału alfa z pierwszym planem do obrazu. Odpowiedź na to pytanie została już udzielona tutaj: http://stackoverflow.com/questions/35886307/how-to-make-white-part-of-the-image-transparent-by-using-android-opencv – masad

+0

Dziękuję, Masad. Uratowałeś mi dzień. –

Odpowiedz

14

udało mi się osiągnąć to za pomocą poniższego fragmentu.

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

Jest to kod Java. Po użyciu polecenia złap tło wyników jest przezroczyste.

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; 
} 
Powiązane problemy