分享一個對實例分割mask修補的方法,希望對大家有所幫助。
1. 這是我準備分割的圖片
2 分割結果
可以看到衣服部分有一些沒分割出來,二值化圖片能清晰看到衣服部分有些黑色未分出的地方。
3 補全mask區域
import cv2
import numpy as npdef 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: # 有大孔洞增加這個閾值continueimg_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 outimg1 = cv2.imread('test.jpg')
mask = fill_mask_hole(img1)
cv2.imwrite('mask1.jpg',mask)
4 結果圖mask1.jpg
ok,補好啦