首页 > 其他分享 >Labelme 图片批量缩放脚本

Labelme 图片批量缩放脚本

时间:2024-12-20 20:57:02浏览次数:6  
标签:img 批量 缩放 labels new path output Labelme dir

Labelme标注文件,批量resize图片和对应标签,可以得到更多的训练数据

import cv2
import os
import json


def resize_image(image, size):
    # 计算新的尺寸,保持宽高比
    r = min(size[0] / image.shape[1], size[1] / image.shape[0])
    dim = (int(image.shape[1] * r), int(image.shape[0] * r))

    # 使用INTER_AREA插值方法进行缩放,适用于缩小图片
    resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
    return resized, r


def adjust_bounding_boxes(json_file, ratio, output_json_file, new_image_path):
    with open(json_file, 'r') as file:
        data = json.load(file)

    for shape in data['shapes']:
        if shape['shape_type'] == 'rectangle':
            points = shape['points']
            new_points = []
            for point in points:
                new_x = point[0] * ratio
                new_y = point[1] * ratio
                new_points.append([new_x, new_y])
            shape['points'] = new_points

    # 更新图像宽度和高度
    data['imageHeight'] = int(data['imageHeight'] * ratio)
    data['imageWidth'] = int(data['imageWidth'] * ratio)

    # 更新 imagePath 字段
    data['imagePath'] = new_image_path

    # 将调整后的信息保存到新文件
    with open(output_json_file, 'w') as file:
        json.dump(data, file, indent=2)


def batch_resize_images_with_bboxes(input_dir, output_dir, labels_dir, output_labels_dir, size):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    if not os.path.exists(output_labels_dir):
        os.makedirs(output_labels_dir)

    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):
            img_path = os.path.join(input_dir, filename)
            img = cv2.imread(img_path)
            if img is None:
                print(f"Failed to read {img_path}")
                continue

            resized_img, ratio = resize_image(img, size)

            # 构造带有缩放比例后缀的新文件名基础部分
            base_name, ext = os.path.splitext(filename)
            suffix = f"_scale_{ratio:.2f}".replace('.', '_')
            output_base_name = f"{base_name}{suffix}"

            # 保存调整大小后的图像
            output_img_filename = f"{output_base_name}{ext}"
            output_img_path = os.path.join(output_dir, output_img_filename)
            cv2.imwrite(output_img_path, resized_img)
            print(f"Resized and saved {output_img_path}")

            # 获取对应的标签文件名,并应用相同的后缀
            label_filename = os.path.splitext(filename)[0] + '.json'
            label_path = os.path.join(labels_dir, label_filename)
            if os.path.exists(label_path):
                output_label_filename = f"{output_base_name}.json"
                output_label_path = os.path.join(output_labels_dir, output_label_filename)

                # 更新 imagePath 为相对路径或绝对路径,取决于原始文件中的格式
                new_image_path = os.path.relpath(output_img_path, start=output_labels_dir)
                adjust_bounding_boxes(label_path, ratio, output_label_path, new_image_path)
                print(f"Adjusted and saved bounding boxes to {output_label_path}")


#
# 设置你的参数
input_directory = 'test_img'  # 输入图片文件夹路径
output_directory = 'Dataset/images'  # 输出图片文件夹路径
labels_directory = 'test_labels'  # 标签文件夹路径
output_labels_directory = 'Dataset/annotations'  # 输出标签文件夹路径
new_size = (1280,720 )  # 新的尺寸(宽度, 高度)

# 执行批量处理
batch_resize_images_with_bboxes(input_directory, output_directory, labels_directory, output_labels_directory, new_size)

这段代码用于批量调整图像大小和相应边界框标注,主要依赖于OpenCV库来处理图像。定义了三个函数:

  1. resize_image(image, size):根据给定的新尺寸调整图像大小,并保持原始宽高比。使用cv2.INTER_AREA插值方法缩小图片,该方法在缩小图片时提供了较好的质量。

  2. adjust_bounding_boxes(json_file, ratio, output_json_file, new_image_path):读取JSON格式的标签文件(假设为矩形边界框),根据图像缩放的比例调整边界框的位置,并更新标签文件中的图像路径、宽度和高度信息,最后将修改后的标签保存到新的JSON文件中。

  3. batch_resize_images_with_bboxes(input_dir, output_dir, labels_dir, output_labels_dir, size):这是主函数,遍历指定输入目录中的所有图像文件,调用上述两个函数来调整图像大小和对应的边界框,然后将结果保存到指定的输出目录中。

要运行这段代码,请确保你已经安装了所需的库(例如OpenCV)并且设置了正确的输入和输出路径。此外,还需注意以下几点:

  • 确保input_directorylabels_directory下的文件名对应正确,即每个图像文件都有一个同名(除了扩展名)的JSON标签文件。
  • 如果图像或标签文件位于子目录中,可能需要调整代码以递归地处理这些子目录。
  • 图像路径和标签路径的设置应该与你的文件系统结构相匹配,特别是相对路径和绝对路径的选择。
  • new_size参数指定了目标图像的宽度和高度,代码会根据这个参数调整所有图像的大小。

标签:img,批量,缩放,labels,new,path,output,Labelme,dir
From: https://blog.csdn.net/m0_50786932/article/details/144619432

相关文章

  • Origin绘图教程 | 创建模板与批量绘图
    主要内容:创建图形模板+批量绘图图形模板 请打开在我们在第一课:我的第一张绘图中保存的项目文件。点选图形窗口。可以通过菜单列表文件:近期项目来快速打开最近保存过的项目文件。 1.双击坐标刻度线标签,打开坐标轴对话框。 2.按住Ctrl键并选中对话框左边的上轴和右轴图标......
  • mysql批量更新数据库内全部表某个字符串为另外一个字符串
    示例:把指定数据库minex-pms所有表中的project_depart_name字段重庆项目部更改为渝北项目部,不存在project_depart_name字段的表排除掉,使用临时表和sql脚本的方式实现sql脚本:--1.创建实体表来存储需要更新的表名CREATETABLEIFNOTEXISTStables_to_update(table_nam......
  • 源码分析之Openlayers中ZoomSlider滑块缩放控件
    概述ZoomSlider滑块缩放控件就是Zoom缩放控件的异形体,通过滑块的拖动或者点击滑槽,实现地图的缩放;另外其他方式控制地图缩放时,也会引起滑块在滑槽中的位置改变;即ZoomSlider滑块缩放控件会监听地图的缩放级别,当级别发生改变时,也会触发ZoomSlider中注册的事件,从而改变滑块的相......
  • PCB批量板厂分享多层PCB内部长啥样?
    今天让我们一同揭开多层PCB,通过立体图形展示的PCB内部结构图,深入探寻各种叠层结构的奥秘。首先,高密度互联板(HDI)的核心关键在于过孔。多层PCB的线路加工与单层双层有相似之处,然而过孔工艺却大相径庭。线路靠蚀刻而成,过孔则需钻孔后镀铜,这是硬件开发的基本常识。多层......
  • 批量为每个mongodb 创建user 给与权限
     importpymongofrompymongo.errorsimportOperationFailure#连接到MongoDBclient=pymongo.MongoClient("mongodb://root:root@192.168.18.54:27017/")#获取所有数据库名称db_names=client.list_database_names()#要创建的用户信息username="mongosea"......
  • Python语言编写多表格批量合并思路
    运用Python语言,可将同一文件夹下的多个表格整合为一个,可避免人工重复性工作,且提高准确性。实现数据的高效汇聚与统一管理,充分彰显Python在数据处理领域的卓越效能与便捷特性。的第一步,精准地选定即将开展表格合并操作所对应的目标文件夹,此文件夹作为整个数据整合的基础数......
  • labelme标注后的数据只剩下面积1600像素以内的小颗粒
    点击查看代码importcv2importnumpyasnpimportjsonimportosdeflist_jsons(folder_path):forfilenameinos.listdir(folder_path):iffilename.endswith(('.json',)):yieldos.path.join(folder_path,filename)defremove_spec......
  • 微信小程序--图片预览组件(可缩放拖动)
    一.自定义图片预览组件,展示图片处理previewImg.wxml<viewclass="preview_box"wx:if="{{previewHideStatus}}"style="top:{{preview_box_top}}"catchtouchmove='stopPageScroll'><details><summary>点击查看代码</summary>......
  • 【AI安全漏洞】VLLM反序列化漏洞分析与保姆级复现(附批量利用)
    #CVE-2024-9052环境需要Linux(这里使用kali)、Anaconda首先安装Anaconda前言最好使用linux,如果使用windows可能会产生各种报错(各种各种各种!!!),最好使用Anaconda,方便独立管理虚拟机使用conda创建虚拟机、python要求3.10condacreate-nvllm_beampython=3.10-y启动该虚拟机......
  • 批量数据传入数据库方法方案
    前端处理好的数据,不是1笔2笔的问题,而是每次几笔或是大批量数据传入数据库。实际上,还是讲求效率与性能。在Insus.NET的博客中,找到几篇以前的随笔,1 使用SqlBulkCopy导入数据至MSSQLServer https://www.cnblogs.com/insus/p/3779879.html2 ASP.NETMVC一次删除多笔记录 ......