目标:Mask中,不同值表示不同的实例(instance),在原图中,绘制不同的instance实例,每个实例用不同颜色表示,实例边界用白色表示。
源码:
def generate_colors(n_colors, seed=47):
"""
随机生成颜色
"""
np.random.seed(seed)
color_list = []
for i in range(n_colors):
color = (np.random.random((1, 3)) * 0.8).tolist()[0]
color = [int(j * 255) for j in color]
color_list.append(color)
return color_list
def draw_mask_layers(image, mask_layers, mask_tk=1):
"""
绘制多层的mask,包含mask的边界,mask中不同值表示不同的instance
:param image: 3通道图像
:param mask_layers: 多instance的mask
:param mask_tk: 边界的厚度
:return: 绘制边界框
"""
img_copy = copy.copy(image)
# 拆分Mask
h, w = mask_layers.shape[:2]
mask_id = np.unique(mask_layers)[1:] # 获取Mask的ID, 0是背景
masks = []
for i in mask_id:
m = np.zeros((h, w), dtype=bool)
m[mask_layers == i] = True
masks.append(m)
# 绘制颜色区域
color_list = generate_colors(len(masks))
for idx, mask in enumerate(masks):
img_copy[mask] = color_list[idx] # 绘制颜色框
image = cv2.addWeighted(image, 0.5, img_copy, 0.5, 0) # 合并mask
# 绘制边界,边界不需要透视效果
for idx, mask in enumerate(masks):
cnt_mask = np.zeros((h, w))
cnt_mask[mask] = 255
cnt_mask = cnt_mask.astype(np.uint8)
contours, _ = cv2.findContours(cnt_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (255, 255, 255), mask_tk) # 绘制白色边界
return image
原图:
Mask图像:
文章出处登录后可见!
已经登录?立即刷新