OpenCV GrabCut删除背景

时间:2018-08-21 16:03:33

标签: python opencv3.0

我已经能够从原始图像中删除大约75%的背景,但是我正在努力调整python代码以删除最后一部分。

Original Image

Output Image

如您所见,图像的下半部分有一部分背景没有与其余部分一起被移除。

import os, time
import numpy as np
import cv2
import matplotlib.pyplot as plt 

org_file_name = 'IMG_3237_reduced.jpg'

#Read Image File
img = cv2.imread(org_file_name))

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,1008,756)
rect2 = (11,222,975, 517)

# Perform the GrabCut on the Image File
t1 = time.clock()
cv2.grabCut(img,mask,rect2,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
t2 = time.clock()
print(t2-t1)

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

# convert to grayscale
gc_img_gray = cv2.cvtColor(gc_img, cv2.COLOR_BGR2GRAY)

_,alpha = cv2.threshold(gc_img_gray,0,255,cv2.THRESH_BINARY)
b, g, r = cv2.split(gc_img)
rgba = [b,g,r, alpha]
gc_split_img = cv2.merge(rgba,4)

# display results
#ax1 = plt.subplot(131); plt.imshow(img)
#ax1.set_title('Original')
#ax2 = plt.subplot(132); plt.imshow(gc_img)
#ax2.set_title('GrabCut')
ax3 = plt.subplot(111); plt.imshow(gc_split_img)
ax3.set_title('GrabCut Split')
plt.show()

我已经在上面附加了我的工作代码。我感谢任何人可以提供的帮助。我的计划是移除背景后,就可以对感兴趣区域进行一些分析/静态建模,以进行进一步的比较。

1 个答案:

答案 0 :(得分:0)

如果这是一次性过程,那么我认为您不需要使用抓取功能。我建议使用类似的方法,在此方法中,您可以结合使用空间和简单代码值阈值设置:

import cv2
import numpy

# Read Image File
img = cv2.imread('NY3Ne.jpg')

# convert RGB to grayscale image
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

mask, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

rect_x = [15, 990]
rect_y = [220, 530]

y, x = numpy.indices(img.shape[:2])

# threshold based on otsu's method
img[mask < thresh] = 0
# set everything outside the rectangle to 0
img[(x < rect_x[0])] = 0
img[(x > rect_x[1])] = 0
img[(y < rect_y[0])] = 0
img[(y > rect_y[1])] = 0

cv2.imshow('masked', img)
cv2.waitKey(0)

但是,如果出于某些其他原因需要进行抓取,则可以将其与简单的阈值结合使用以获得所需的结果。 150基于您的图像是任意的,但是您可以用Otsu或任何其他自适应二进制阈值计算方法代替。

alpha = np.where(gc_img_gray < 150, 255, 0).astype(np.uint8)
gc_img[alpha==0] = 0

更多信息:https://docs.opencv.org/3.4.0/d7/d4d/tutorial_py_thresholding.html