问题:RGB 伪彩色转 gray灰度
色域对应如下:二分类,输出,输出如下,格式 .png
Origin_Point_Value = np.array([[0, 0, 0], [255, 255, 0]])
Out_Point_Value = np.array([0, 1])
#--------------------------------------------------------
#根据自己的数据特性,自写数据集转化, 标签图片必须是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进行保存