Labelm格式数据集操作——将png的图片转为jpg的图片

实现将PNG图片转换为JPG格式,并更新对应JSON文件中图片路径和图片数据,代码如下:

import os
import json
import base64
from PIL import Image
from io import BytesIO

def convert_png_to_jpg_and_update_json(input_folder):
    """
    将文件夹中的PNG图片转换为JPG格式,并更新对应的JSON标注文件
    :param input_folder: 包含PNG图片和JSON文件的文件夹路径
    """
    # 遍历文件夹中的所有文件
    for filename in os.listdir(input_folder):
        if filename.lower().endswith('.png'):
            png_path = os.path.join(input_folder, filename)
            
            # 生成对应的JPG文件名和路径
            jpg_filename = os.path.splitext(filename)[0] + '.jpg'
            jpg_path = os.path.join(input_folder, jpg_filename)
            
            # 生成对应的JSON文件名和路径
            json_filename = os.path.splitext(filename)[0] + '.json'
            json_path = os.path.join(input_folder, json_filename)
            
            # 1. 转换图片格式 PNG -> JPG
            try:
                with Image.open(png_path) as img:
                    # 转换为RGB模式(去除Alpha通道)
                    if img.mode in ('RGBA', 'LA'):
                        background = Image.new('RGB', img.size, (255, 255, 255))
                        background.paste(img, mask=img.split()[-1])
                        img = background
                    elif img.mode != 'RGB':
                        img = img.convert('RGB')
                    
                    # 保存为JPG
                    img.save(jpg_path, 'JPEG', quality=95)
                print(f"转换成功: {filename} -> {jpg_filename}")
            except Exception as e:
                print(f"转换失败 {filename}: {str(e)}")
                continue
            
            # 2. 更新JSON文件(如果存在对应的JSON文件)
            if os.path.exists(json_path):
                try:
                    with open(json_path, 'r', encoding='utf-8') as f:
                        data = json.load(f)
                    
                    # 更新图片路径
                    data['imagePath'] = jpg_filename
                    
                    # 更新图片数据(可选)
                    if 'imageData' in data:
                        with open(jpg_path, 'rb') as img_file:
                            # 将新图片编码为base64
                            new_image_data = base64.b64encode(img_file.read()).decode('utf-8')
                        data['imageData'] = new_image_data
                    
                    # 保存更新后的JSON
                    with open(json_path, 'w', encoding='utf-8') as f:
                        json.dump(data, f, indent=2)
                    
                    print(f"更新成功: {json_filename}")
                except Exception as e:
                    print(f"更新JSON失败 {json_filename}: {str(e)}")
            else:
                print(f"未找到对应的JSON文件: {json_filename}")

# 使用示例
if __name__ == "__main__":
    target_folder = "/path/to/your/labelme/folder"  # 替换为你的文件夹路径
    convert_png_to_jpg_and_update_json(target_folder)

代码说明:

  1. 图片格式转换

    • 使用PIL库打开PNG图片
    • 处理透明通道(RGBA模式转换为RGB)
    • 保存为JPG格式(质量设置为95%)
  2. JSON文件更新

    • 更新imagePath字段为新的JPG文件名
    • 可选更新imageData字段(重新编码JPG图片为base64)
    • 保留JSON文件原有结构,只修改必要字段
  3. 错误处理

    • 捕获并报告图片转换错误
    • 捕获并报告JSON处理错误
    • 跳过无对应JSON文件的图片

使用注意事项:

  1. 依赖安装

    pip install Pillow
    
  2. 透明通道处理

    • 透明区域会自动填充为白色背景
    • 如果需要保留透明效果,需重新考虑转换方案(JPG不支持透明)
  3. 文件命名

    • 假设PNG和JSON文件具有相同的主文件名
    • 例如:image1.png 对应 image1.json
  4. 图片质量

    • 当前设置为95%质量,可根据需要调整quality参数
  5. 原始文件

    • 代码不会删除原始PNG文件,如需清理请手动操作
    • 原始JSON文件会被更新覆盖,建议提前备份

此代码完整实现了从PNG到JPG的转换,并保持LabelMe标注文件的同步更新,同时处理了图片格式转换中的常见问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值