Opencv 如何删除grabcut中带有阴影的白色背景?

Opencv 如何删除grabcut中带有阴影的白色背景?,opencv,image-processing,opencv3.0,opencv-contour,Opencv,Image Processing,Opencv3.0,Opencv Contour,我正在使用grabcut从图像中删除白色背景。边缘的部分背景保留下来。你能帮我把阴影部分也去掉吗 输入图像 输出图像 尝试了剪切、轮廓、正常阈值,但阴影仍然存在 img_ray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(img_ray, 127, 255, cv.THRESH_BINARY+cv.THRESH_OTSU) contours, hierarchy = cv.findContours(thre

我正在使用grabcut从图像中删除白色背景。边缘的部分背景保留下来。你能帮我把阴影部分也去掉吗

输入图像

输出图像

尝试了剪切、轮廓、正常阈值,但阴影仍然存在

img_ray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_ray, 127, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
cnt = contours[4]
cv.drawContours(img, [cnt], 0, (0, 255, 0), 3)
mask = np.zeros(img.shape[:2], np.uint8)
bgdmodel = np.zeros((1, 65), np.float64)
fgdmodel = np.zeros((1, 65), np.float64)
height = img.shape[0]
width = img.shape[1]
rect = (50, 0, width, height)
cv.grabCut(img, mask, rect, bgdmodel, fgdmodel, 10, cv.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img = img * mask2[:, :, np.newaxis]
img[np.where((img == [230, 230, 230]).all(axis=2))] = [0, 0, 0]
cv.bitwise_not(img)

它应该删除完整的背景

此答案说明了如何使用Grabcut和遮罩提取前景。这个答案有两个步骤。第一步是创建一个遮罩,将像素标记为确定前景、确定背景或未知。第二步是应用Grabcut算法

使用
Canny
边缘过滤器和两个过滤器创建遮罩

此掩码将向Grabcut算法提示什么是确定前景,什么是确定背景。接下来,使用遮罩应用Grabcut:

bgdmodel = np.zeros((1, 65), np.float64)
fgdmodel = np.zeros((1, 65), np.float64)

out_mask = mask.copy()
out_mask, _, _ = cv.grabCut(img,out_mask,None,bgdmodel,fgdmodel,1,cv.GC_INIT_WITH_MASK)
out_mask = np.where((out_mask==2)|(out_mask==0),0,1).astype('uint8')
out_img = img*out_mask[:,:,np.newaxis]
mask
显示为
mask*123
,因此sure forground为灰色,sure background为黑色,unknown为白色:

它适用于上面的图像,但不适用于下面这样的其他珠宝图像。有没有办法提高准确度?@VedantBHegde我需要源图像进行更多测试。以下是这个网站运行良好的源图像。不知道他们是怎么做到的。你有什么解决办法吗@Stephen
bgdmodel = np.zeros((1, 65), np.float64)
fgdmodel = np.zeros((1, 65), np.float64)

out_mask = mask.copy()
out_mask, _, _ = cv.grabCut(img,out_mask,None,bgdmodel,fgdmodel,1,cv.GC_INIT_WITH_MASK)
out_mask = np.where((out_mask==2)|(out_mask==0),0,1).astype('uint8')
out_img = img*out_mask[:,:,np.newaxis]