几行代码_标签图像mask图像转化成RGB颜色图像可视化label图像

  • Post author:
  • Post category:其他


简介

在做图像分类或者语义分割时候,大家都会接触到标签图像。标签图像也称gt或者mask图,其可能为单通道图像,也可能为3通道图像(RGB通道值相同),由于标签通常是0,1,2,3,…所以打开看着就是全黑,有时候做实验自己想看看标签图或者想看看自己生成的标签,就需要将标签进行可视化表达。

网上也有相关方法,但是看着有点复杂,随即写了几行代码,很简单,第一次入手的同学可以看的懂。因为本人也非科班,代码有瑕疵欢迎随时指出。

流程

1、确定颜色映射关系

这里主要根据需求来设定不同label值可视化后呈现颜色。可以通过查询RGB色板,或者其他方法,根据个人喜好设定。我们可以预设多个数据集的对应关系,需要使用的时候用哪个选哪个即可。

def color_map(dataname):
    “”“
    这里可以预设多个对应关系,疯狂if... elif...即可
    这里以LoveDa数据集为例:
    该方法返回的是对应关系,类型为字典dict
    注意图像通道 (B G R)
    ”“”
    if dataname == "LoveDa":
        color_map_ = {
            0: [0, 0, 0],  # ignore
            1: [255, 248, 220],  # background
            2: [100, 149, 237],  # building
            3: [102, 205, 170],  # road
            4: [205, 133, 63],  # water
            5: [160, 32, 240],  # barren
            6: [255, 64, 64],  # forest
            7: [139, 69, 19],  # agriculture
            }
        return color_map_
    else:
        print("DATA name error!")

2、读取label图像并生成带色彩的图像

这里首先获取label图像A,在生成一个新的图像B,A与B尺寸相同。然后读取A图像(x,y)处像素的label值,然后再查询映射字典在B图像相同位置替换成预设RGB值。本质就是操作矩阵(or Tensor)。

def gt2color(path):
    # read image (np.array)
    img = cv2.imread(path)
    # show image
    cv2.imshow("GT", img)
    # 生成一个尺寸相同的图像,注意这里label图像是3通道的,如果你label是单通道,稍微修改下
    img_out = np.zeros(img.shape, np.uint8)
    # 获取图像宽*高
    img_x, img_y = img.shape[0], img.shape[1]
    # 得到该数据色彩映射关系
    label_color = color_map(dataname=dataname)
    # 每行每列像素值依次替换,这里写的简单,你也可以用for ... enumerate...获取索引和值 
    for x in range(img_x):
        for y in range(img_y):
            label = img[x][y][0]    # get img label
            img_out[x][y] = label_color[label]
    cv2.imshow("RGB", img_out)
    return img_out
    # 另存图片
    # cv2.imwrite(r"D:\...\1367_rgb.png", img_out)

3 剩余代码

这三个代码copy到一起就是完整代码了,直接在你电脑上运行即可。萌新需要注意的是cv库路径中不要包含中文,不然会报错。

if __name__ == "__main__":
    # 定义数据集,图像路径
    dataname = r"LoveDa"
    img_path = r"...\1367.png"
    img_fold = r"...\datasets" # 批处理根目录
    get_color_img = gt2color(img_path)
    cv2.waitKey()

EX 批处理

上面都是针对一个label图像的可视化,批处理主要提取出每个图像的路径,再针对每个路径执行gt2color()方法即可。这里给出路径列表方法。

def get_filename_list(path):
    file_list = []
    for root, dirnames, filenames in os.walk(path):
        for filename in filenames:
            file_ = {}
            file = filename.split(".png")[0]
            file_['file'] = file
            file_list.append(file_)
     
     return file_list

Result



版权声明:本文为weixin_37879562原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。