欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PASCAL VOC 2012调色板color map生成源代码分析

程序员文章站 2022-04-05 12:36:30
...

在PASCAL VOC 2012图像分割数据集的分割标签图片是取值为0~255的灰度图片,为了可视化,需要对每一个标签索引分配相应的rgb分量,从而使得原始的标签分割图片转化为上色后的彩色分割图片。根据VOC数据集的color map生成代码,我们可以知道,主要利用的思想是把每个label index和rgb分量看做一个字节/8位2进制数,然后不断地把最低的三位比特从高到低地放入rbg分量并对label index移位。

def bitget(byteval, idx):
    return (byteval & 1 << idx) != 0  # 判断输入字节的idx比特位上是否为1

def color_map(N=256, normalized=False):
    dtype = 'float32' if normalized else 'uint8'
    cmap = np.zeros((N, 3), dtype=dtype)
    for i in range(N):
        c = i
        r = g = b = 0  # 将类别索引和rgb分量都视为8位2进制数,即一个字节
        for j in range(8):  # 从高到低填入rgb分量的每个比特位
            r = r | bitget(c, 0) << (7 - j)  # 每次将类别索引的第0位放置到r分量
            g = g | bitget(c, 1) << (7 - j)  # 每次将类别索引的第1位放置到g分量
            b = b | bitget(c, 2) << (7 - j)  # 每次将类别索引的第2位放置到b分量
            c = c >> 3  # 将类别索引移位
        cmap[i] = np.array([r, g, b])
    cmap = cmap / 255 if normalized else cmap
    return cmap

调用color_map(21),得到VOC12的调色板:

[[  0   0   0]
 [128   0   0]
 [  0 128   0]
 [128 128   0]
 [  0   0 128]
 [128   0 128]
 [  0 128 128]
 [128 128 128]
 [ 64   0   0]
 [192   0   0]
 [ 64 128   0]
 [192 128   0]
 [ 64   0 128]
 [192   0 128]
 [ 64 128 128]
 [192 128 128]
 [  0  64   0]
 [128  64   0]
 [  0 192   0]
 [128 192   0]
 [  0  64 128]]

 

相关标签: pascal