JSON格式转PNG(用于语义分割数据集标签转换)

               如果你需要批量转换多个语义分割的JSON标签文件为图像,假设你的JSON文件和图像文件有对应关系,文件名相同,只是后缀不同(比如.json和.png)。

from PIL import Image, ImageDraw
import json
import os
import random

def random_color():
    # 生成一个随机颜色
    return tuple(random.randint(0, 255) for _ in range(3))

def json_to_image(json_path, image_size, label_to_color, mode='L'):
    # 读取JSON文件
    with open(json_path, 'r') as f:
        data = json.load(f)

    # 创建一张空白图像,可以根据需要选择 'L' (灰度图) 或 'P' (8位彩色图)
    image = Image.new(mode, image_size, color='white')
    draw = ImageDraw.Draw(image)

    # 将JSON中的标签信息映射到图像上
    for shape in data['shapes']:
        label = shape['label']
        points = shape['points']

        # 将多边形坐标映射到像素位置
        polygon_points = [(int(point[0]), int(point[1])) for point in points]

        # 获取标签对应的颜色,如果标签不存在于映射中,则生成一个新的颜色
        color = label_to_color.setdefault(label, random_color())

        # 在图像上绘制多边形
        draw.polygon(polygon_points, fill=color)

    return image

def batch_convert(json_folder, image_folder, output_folder, mode='L'):
    # 遍历JSON文件夹中的所有文件
    label_to_color = {}  # 存储标签到颜色的映射
    for json_file in os.listdir(json_folder):
        if json_file.endswith('.json'):
            json_path = os.path.join(json_folder, json_file)

            # 构建对应的图像文件路径
            image_file = os.path.splitext(json_file)[0] + '.jpg'
            image_path = os.path.join(image_folder, image_file)

            # 转换JSON到图像
            result_image = json_to_image(json_path, Image.open(image_path).size, label_to_color, mode)

            # 保存结果图像
            output_path = os.path.join(output_folder, image_file)
            result_image.save(output_path)

if __name__ == "__main__":
    # 设置文件夹路径
    json_folder = 'path/to/json/files'
    image_folder = 'path/to/image/files'
    output_folder = 'path/to/output'

    # 批量转换为灰度图
    batch_convert(json_folder, image_folder, output_folder, mode='L')

    # 批量转换为8位彩色图
    # batch_convert(json_folder, image_folder, output_folder, mode='P')

你可以在json_to_image函数的mode参数中选择模式,使用'L'表示灰度图,使用'P'表示8位彩色图。这样你就可以根据需要生成不同类型的图像。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值