分享一个对实例分割mask修补的方法,希望对大家有所帮助。
1. 这是我准备分割的图片

2 分割结果
可以看到衣服部分有一些没分割出来,二值化图片能清晰看到衣服部分有些黑色未分出的地方。
3 补全mask区域
import cv2
import numpy as np
def fill_mask_hole(img):
# 将输入图片二值化
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, mask= cv2.threshold(img, 250, 255, cv2.THRESH_BINARY)
# 二值化图片黑白反转
mask = 255-mask
# 因为最下面有一块黑色区域,没完全被包围。将最下面一行像素改成白色,保住黑色区域
mask[-1,:] = 255
# 寻找有多少孔洞
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 孔洞个数
len_contour = len(contours)
contour_list = []
# 逐个补孔
for i in range(len_contour):
drawing = np.zeros_like(mask, np.uint8) # create a black image
# 根据孔洞范围判断需不需要补
area = cv2.contourArea(contours[i])
if area>1000: # 有大孔洞增加这个阈值
continue
img_contour = cv2.drawContours(drawing, contours, i, (255, 255, 255), -1)
contour_list.append(img_contour)
out = sum(contour_list)
# 对应上面mask[-1,:] = 255,将改的白边改回来
out[-1,:] = out[-2,:]
return out
img1 = cv2.imread('test.jpg')
mask = fill_mask_hole(img1)
cv2.imwrite('mask1.jpg',mask)
4 结果图mask1.jpg

ok,补好啦