我正在使用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]
之后,我试着找出轮廓。
我试图通过以下代码找到轮廓:
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)
它返回长度为a contours array
的{{1}}。当我画出来的时候:
第一个问题是如何获得此抓斗的轮廓(阵列)?
第二个问题:如您所见,背景颜色为黑色。 如何将背景颜色更改为白色?
谢谢。
答案 0 :(得分:10)
首先,您需要获得背景信息。必须使用蒙版图像从原始图像中减去此值。然后将黑色背景更改为白色(或任何颜色)。然后回来添加面具的图像。
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/
答案 1 :(得分:-1)
如果你想要一个像边界一样的轮廓,你可以对边缘图像上的抓取输出和形态膨胀进行边缘检测,得到一个合适的连通轮廓,并得到边界像素数组。
为了使背景变为白色,边界框外的所有像素都可以默认为白色。边界框内的黑色像素,可以与原始图像对应的灰度级进行比较,如果是黑色,则可以保留,否则使其变为白色。因为如果原始像素不是黑色,而是通过抓取制成黑色,那么它被视为背景。如果前景中有黑色像素,则抓取不会使其变为黑色(理想情况)。