语义分割标签从RGB转到灰度gray处理方式

小细节问题比较折磨人

问题:RGB 伪彩色转 gray灰度
色域对应如下:二分类,输出,输出如下,格式 .png

Origin_Point_Value = np.array([[0, 0, 0], [255, 255, 0]])
Out_Point_Value = np.array([0, 1])

批量转换代码如下:(RGB—>gray)

#--------------------------------------------------------
#根据自己的数据特性,自写数据集转化, 标签图片必须是png
# 元数据为RGB二类标签(24位)0-255, 转化为8为灰度[0-1] 二值过程
#-------------------------------------------------------
import os
import numpy as np
from PIL import Image
from tqdm import tqdm

Origin_SegmentationClass_path = "F:/rock_data/VOC2007/SegmentationClass2"
Out_SegmentationClass_path = "F:/rock_data/VOC2007/segall"

# 对应关系
Origin_Point_Value = np.array([[0, 0, 0], [255, 255, 0]])
Out_Point_Value = np.array([0, 1])

if __name__ == "__main__":
    if not os.path.exists(Out_SegmentationClass_path):
        os.makedirs(Out_SegmentationClass_path)
    #
    png_names = os.listdir(Origin_SegmentationClass_path) # 获得图片的文件名
    print("正在遍历全部标签。")
    for png_name in tqdm(png_names):
        png = Image.open(os.path.join(Origin_SegmentationClass_path, png_name)) # RGB
        w, h = png.size
        png = np.array(png, np.uint8) # h, w, c
        out_png = np.zeros([h, w]) # 灰度 h, w

        for map_idx, rgb in enumerate(Origin_Point_Value):
            idx = np.where(
                (png[..., 0] == rgb[0]) & (png[..., 1] == rgb[1]) & (png[..., 2] == rgb[2]))
            out_png[idx] = map_idx

        # print("out_png:", out_png.shape)

        out_png = Image.fromarray(np.array(out_png, np.uint8)) # 再次转化为Imag进行保存
        out_png.save(os.path.join(Out_SegmentationClass_path, png_name))
  # -------------------------------------#
    #   统计输出,各个像素点的值得个数
    # -------------------------------------#
    print("正在统计输出的图片每个像素点的数量。")
    classes_nums = np.zeros([256], np.int32)
    for png_name in tqdm(png_names):
        png_file_name = os.path.join(Out_SegmentationClass_path, png_name)
        if not os.path.exists(png_file_name):
            raise ValueError("未检测到标签图片%s,请查看具体路径下文件是否存在以及后缀是否为png。" % (png_file_name))

        png = np.array(Image.open(png_file_name), np.uint8)
        classes_nums += np.bincount(np.reshape(png, [-1]), minlength=256)

    print("打印像素点的值与数量。")
    print('-' * 37)
    print("| %15s | %15s |" % ("Key", "Value"))
    print('-' * 37)
    for i in range(256):
        if classes_nums[i] > 0:
            print("| %15s | %15s |" % (str(i), str(classes_nums[i])))
            print('-' * 37)

有价值的参考:
【1】将语义分割标注图像显示为彩色图像
【2】【语义分割】label2color2label_灰度标签彩色化、彩色标签灰度化

注意:转化过程容易出现,全0,或者全1的情况
是由于利用 Image.open 或者 cv2 读取的图片的格式不同,或者不正确引起的
如果利用PIL----转np----PIL会发生宽高变化,输出的out_png必须进行调整,然后再次转为PIL进行保存才不会错。 如下:

png = Image.open(os.path.join(Origin_SegmentationClass_path, png_name)) # RGB
w, h = png.size
 png = np.array(png, np.uint8) # h, w, c
 out_png = np.zeros([h, w]) # 灰度 h, w
 out_png = Image.fromarray(np.array(out_png, np.uint8)) # 再次转化为Imag进行保存

你可能感兴趣的:(PyTorch,语义分割标签处理,numpy,python)