首先想到的方法是直接调用PIL库Image的convert方法
img = img.convert(model = 'p')
但covert中的调色板技术使用的是WEB和ADAPTIVE两种,先生成256位的数组,确定索引,再使用快速二叉树给索引值指定颜色,暂未找到更改索引对应颜色的方法。还发现有趣的是,Image的convert将RGB图像转化为P模式的图像,会将(255,0,0)转成值为15,(255,255,0)值为40,(0,255,0)为45,(0,0,255)转为192.不知道这个值怎么计算出来的。
最后找到有效的方法:来自deeplab-v3+的公开源码中对pascal voc 数据集处理:
def encode_segmap(mask):
"""Encode segmentation label images as pascal classes
Args:
mask (np.ndarray): raw segmentation label image of dimension
(M, N, 3), in which the Pascal classes are encoded as colours.
Returns:
(np.ndarray): class map with dimensions (M,N), where the value at
a given location is the integer denoting the class index.