在OpenCV Grabcut python中同时使用rect和mask

时间:2014-09-25 13:56:11

标签: python opencv shapely

我在Windows上使用Python中的OpenCV 3 alpha。我有一个背景减法方法,导致使用grabcut进行图像分割。所以我有MOG探测器给我一些关于可能的前景和背景的信息。因此,例如,这里是当前图像(仅用于可视化的rect)。

Input image

这是MOG探测器的输出。

enter image description here

我想将此信息提供给cv2.grabcut。我希望我不需要分割整个图像,并且指定已知对象周围的区域并传递可能的前景和背景会更快(?)。斑点存储为形状多边形,其边界为xmin,ymin,xmax,ymax

  

#expand the bounding box of the polygons about 5 times
b=blob.buffer(50).bounds

#change to integer
rect=[int(x) for x in b]

#Shapely give coordinates in xmin,ymin,xmax,ymax

#Format into x,y,w,h required by grabcut in opencv
rectf=tuple([rect[0],rect[1],rect[2]-rect[0],rect[3]-rect[1]])                                                 

#create a mask
mask = np.zeros(grabCUTimage.shape[:2],np.uint8)

#Make anywhere black in the grey_image (output from MOG) as likely background
#Make anywhere white in the grey_image (output from MOG) as definite foreground
mask[grey_image == 0] = 2
mask[grey_image == 255] = 1    

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

#Run grabcut
cv2.grabCut(grabCUTimage,mask,rectf,bgdModel,fgdModel,4,cv2.GC_INIT_WITH_RECT)

#Multiple new mask by original image to get cut            
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
cGB =grabCUTimage*mask2[:,:,np.newaxis]

这总是给我一个黑色的图像。所有背景。

当我使用cv2.GC_INIT_WITH_MASK进行初始化时,它可以正常工作(请忽略红色方块)。然而它肯定忽略了rect,因为有时它包括在rect边界之外的估计前景(在这种情况下未示出)。

enter image description here

我存储了rect错吗?是不是x,y,w,h?指定一个矩形实际上会使它更快或我应该裁剪图像吗?

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确,但是当你使用" GC_Init_with_Rect"在Grabcut中,最好初始化整个蒙版并将其设置为"可能是背景":

mask = Mat::ones(image.size(), CV_8UC1) * GC_PR_BGD; //GC_PR_BGD

它的C ++,但我认为你明白了。

更新1: 我不认为这更快,但是当您使用MOG信息在ROI周围绘制更大的矩形时,您可以将矩形的外部设置为GC_BGD。这应该更快。

答案 1 :(得分:0)

我可以看到这是一个老问题,但我现在正在研究它,似乎矩形定义中存在错误。我将我的参数定义为(x,y, h w ),它对我来说非常有效。

希望它有所帮助。