from PIL import Image
print(Image.open('2007_000032.png').mode) # L
print(Image.open('2007_000033.png').mode) # P
二、两种模式对应的读写方法
之所以其mode属性不同(一个是L,代表灰度模式,另一个是P,代表调色板模式),是因为对分割好的mask文件保存时的方式不同。对于灰度模式,直接使用cv2.imwrite()函数进行保存即可,只不过读取时,需要按照灰度图的方式读取|(用OpenCV或者PIL格式均可以):
# 方式一:
label = cv2.imread(label_path, 0)
# 方式二:
label = np.asarray(Image.open(label_path), dtype=np.int32)
而对于调色板模式,其保存方式如下:
def save_colored_mask(mask, save_path):
lbl_pil = Image.fromarray(mask.astype(np.uint8), mode="P")
colormap = imgviz.label_colormap()
lbl_pil.putpalette(colormap.flatten())
lbl_pil.save(save_path)
如上,需要先将array格式的mask转为PIL.Image格式,然后,使用imgviz中的Label colormap给mask添加调色板,最后保存PIL.Image格式的图像即可。读取时,则需要同样使用PIL.Image格式来读取,然后转为array,而不可以使用OpenCV进行读取:
# 正确的读取方式
label = np.asarray(Image.open(label_path), dtype=np.int32)
# 错误的读取方式:因为调色板模式下,使用cv2.imread(label_path, 0)会默认以BGR转灰度图的模式读取,从而导致得到的label值不一致
label = cv2.imread(label_path, 0)
三、语义分割mask可视化
对于可视化则比较简单,因为不需要考虑模式问题,可以使用OpenCV也可以使用PIL的方式:
# OpenCV方式:
image = cv2.imread('2007_000033.jpg')
mask = cv2.imread('2007_000033.png')
mask_img = cv2.addWeighted(image, 0.5, mask, 0.7, 0.9)
cv2.imwrite("vis.jpg", mask_img)
# PIL方式:
image = Image.open('2007_000033.jpg')
mask = Image.open('2007_000033.png')
mask_img = Image.blend(image.convert('RGBA'),
mask.convert('RGBA'), 0.7)
mask_img.save("vis2.png")
两种方式的可视化结果一样: