tool_img2mask.py 2.1 KB
Newer Older
氢键H-H's avatar
init  
氢键H-H 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
import os
import numpy as np
import imgviz
from PIL import Image

absolute_path = os.path.abspath(os.path.dirname(__file__)).replace('\\', '/')
data_dir_path = absolute_path + '/resources/images/annotations/trimaps'

ImgFileNameList = os.listdir(data_dir_path)


def get_gray_cls(van_lbl, array_lbl):
    cls = [2, 3]  # 用来存储灰度图像中每种类别所对应的像素,默认背景色为0
    for x in range(van_lbl.size[0]):
        for y in range(van_lbl.size[1]):
            if array_lbl[y, x] not in cls:
                cls.append(array_lbl[x, y])
    return cls


def get_P_cls(cls_gray):
    cls_P = []  # 将灰度图像中的每类像素用0~N表示
    for i in range(len(cls_gray)):
        cls_P.append(i)
    return cls_P


def array_gray_to_P(cls_gray, cls_P, array):
    for i in range(len(cls_gray)):
        array[array == cls_gray[i]] = cls_P[i]
    return array


if __name__ == '__main__':
    van_file = data_dir_path + '/Abyssinian_1.png'  # 必须是一张包含所有类别的图像,称之为先锋图像
    van_lbl = Image.open(van_file).convert('L')  # 将先锋图像转换为灰度图像

    array_lbl = np.array(van_lbl)  # 获得灰度图像的numpy矩阵

    cls_gray = get_gray_cls(van_lbl, array_lbl)  # 获取灰度图像中每种类别所对应的像素值
    cls_P = get_P_cls(cls_gray)  # 将灰度图像中的每种类别所对应的像素值映射为0~N

    # 遍历每一张原始图像
    len_img = len(ImgFileNameList)
    for i in range(len_img):
        orig_lbl = Image.open(data_dir_path + '/' + ImgFileNameList[i]).convert('L')  # 将图像转换为灰度图像
        array_gray = np.array(orig_lbl)  # 获得灰度图像的numpy矩阵
        array_P = array_gray_to_P(cls_gray, cls_P, array_gray)  # 将灰度图像的numpy矩阵值映射为0~N
        label = Image.fromarray(array_P.astype(np.uint8), mode='P')  # 转换为PIL的P模式
        # 转换成VOC格式的P模式图像
        colormap = imgviz.label_colormap()
        label.putpalette(colormap.flatten())
        label.save(data_dir_path + '/' + ImgFileNameList[i])