2016-06-27 406 views
2

我正在使用Python和OpenCV。我現在使用grabcut()來裁剪出我想要的物體。這裏是我的代碼:Python中的OpenCV grabcut()背景顏色和輪廓

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 enter image description here

之後,我試圖找出輪廓。

我曾嘗試下面的代碼,以查找輪廓:

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) 

而且它與長度48返回a contours array。當我畫出這個: enter image description here

第一個問題是我怎樣才能得到這個抓取輪廓(陣列)?

enter image description here 第二個問題:如您所見,背景顏色爲黑色。 如何將背景顏色更改爲白色?

謝謝。

+0

採取信息都是正確的,我應該串聯了'contours'到一個合併的名單? – VICTOR

回答

-1

如果您想要一個像輪廓一樣的輪廓,您可以對邊緣圖像上的抓取和形態膨脹的輸出進行邊緣檢測,以獲得適當的連接輪廓,並且可以獲得邊界的像素陣列。

爲了使背景變白,可以將邊界框外的所有像素默認設置爲白色。邊界框內的黑色像素,可以與原始圖像對應的灰度級進行比較,如果是黑色,則可以保留,否則將其設爲白色。因爲如果原始像素不是黑色的,而是通過抓圖變成黑色,那麼它將被視爲背景。如果前景中有黑色像素,則抓取部分永遠不會變黑(理想情況)。

+0

首先,輪廓數組包含37個不同的輪廓。我怎樣才能得到「正確」的。其次,如果我只是簡單地將黑色像素替換爲255,它不僅會轉換背景,還會轉換圖像上下文。 – VICTOR

5

首先,您需要了解背景。必須用掩模圖像從原始圖像中減去此值。然後將黑色背景更改爲白色(或任何顏色)。然後回到添加面具的圖像。

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() 

從網站 https://nxtify.wordpress.com/2015/02/24/image-background-removal-using-opencv-in-python/