OpenCV grabcut() background color and Contour in Python
Question: I am using Python and OpenCV. I am now using `grabcut()` to crop out the
object I want. Here is my code:

    
    
    img = cv2.imread('test.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    mask = np.zeros(img.shape[:2], np.uint8)
    
    bgdModel = np.zeros((1, 65), np.float64)
    fgdModel = np.zeros((1, 65), np.float64)
    
    rect = (2,2,630,930)
    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]
    

[![enter image description
here](http://i.stack.imgur.com/gpo6i.jpg)](http://i.stack.imgur.com/gpo6i.jpg)
[![enter image description
here](http://i.stack.imgur.com/yNFCs.jpg)](http://i.stack.imgur.com/yNFCs.jpg)

Afterwards, I try to find out the contour.

I have tried to find the contour by the code below:

    
    
    imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret,thresh = cv2.threshold(imgray,127,255,0)
    im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    

And it returns `a contours array` with length `48`. When I draw this out:
[![enter image description
here](http://i.stack.imgur.com/BqZqK.png)](http://i.stack.imgur.com/BqZqK.png)

**First question is how can I get the contour (array) of this grab cut?**

[![enter image description
here](http://i.stack.imgur.com/WKjAC.png)](http://i.stack.imgur.com/WKjAC.png)
Second question: as you can see, the background color is black. **How can I
change the background color to white?**

Thank you.


Answer: At first, you need to get the background. To this must be subtracted from the
original image with the mask image. And then change the black background to
white (or any color). And then back to add with the image of the mask.

    
    
    import numpy as np
    import cv2
    
    cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)
    
    #Load the Image
    imgo = cv2.imread(‘input.jpg’)
    height, width = imgo.shape[:2]
    
    #Create a mask holder
    mask = np.zeros(imgo.shape[:2],np.uint8)
    
    #Grab Cut the object
    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)
    
    #Hard Coding the Rect… The object must lie within this rect.
    rect = (10,10,width-30,height-30)
    cv2.grabCut(imgo,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
    mask = np.where((mask==2)|(mask==0),0,1).astype(‘uint8’)
    img1 = imgo*mask[:,:,np.newaxis]
    
    #Get the background
    background = imgo – img1
    
    #Change all pixels in the background that are not black to white
    background[np.where((background > [0,0,0]).all(axis = 2))] =[255,255,255]
    
    #Add the background and the image
    final = background + img1
    
    #To be done – Smoothening the edges….
    
    cv2.imshow(‘image’, final )
    
    k = cv2.waitKey(0)
    
    if k==27:
    cv2.destroyAllWindows()
    

Information taken from the site
<https://nxtify.wordpress.com/2015/02/24/image-background-removal-using-
opencv-in-python/>

