pythons工具——裁剪labelme的json不规则多边形标签保存成矩形图像

news2024/10/5 10:38:15

原图在这里插入图片描述labelme标注在这里插入图片描述

使用以下程序,裁剪labelme的json不规则多边形标签保存成矩形图像

import os
import cv2
import math
import json
import numpy as np
from PIL import Image, ImageDraw

def calculate_bounding_box(points):
    """计算多边形的最小外包矩形"""
    min_x = min(point[0] for point in points)
    min_y = min(point[1] for point in points)
    max_x = max(point[0] for point in points)
    max_y = max(point[1] for point in points)
    return min_x, min_y, max_x, max_y


def crop_and_rectify_polygon(image_path, json_path, output_dir=None):
    """根据JSON标注读取不规则四边形 并转换为规则矩形图像"""
    with Image.open(image_path) as img:
        img_width, img_height = img.size
        
        with open(json_path, 'r') as f:
            data = json.load(f)
        
        if not output_dir:
            output_dir = os.path.dirname(image_path)
            
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        
        for idx, shape in enumerate(data['shapes'], start=1):
            # 确保处理的是不规则四边形
            if len(shape['points']) != 4:
                continue
            label = shape['label']
            # if "ocr_" in label or "smg_" in label:
            if label=="车牌":
                # 计算不规则四边形的长边和短边长度
                x1, y1, x2, y2 = calculate_bounding_box(shape['points'])
                # 裁剪图像
                cropped_img = img.crop((x1, y1, x2, y2))
                
                # 保存裁剪后的图像
                output_filename = f"{os.path.splitext(os.path.basename(image_path))[0]}_{label}_{idx}_cropped.jpg"
                output_path = os.path.join(output_dir, output_filename)
                cropped_img.save(output_path)
                print(f"裁剪完成并保存至: {output_path}")

if __name__ == '__main__':
    image_path = '1.jpg'
    json_path = '1.json'
    crop_and_rectify_polygon(image_path, json_path, output_dir="./")

效果图

使用以下程序,裁剪labelme的json不规则多边形标签保存成矩形图像
增加了放射变换


def perspective_transform(image_path, pts, output_size=(500, 500)):
    """
    对图像中的四边形区域进行透视变换,矫正为规则矩形。
    
    :param image_path: 图像路径
    :param pts: 四边形的四个顶点坐标,顺序为[(top_left), (top_right), (bottom_right), (bottom_left)]
    :param output_size: 输出图像的尺寸,默认为(500, 500)
    :return: 矫正后的图像
    """
    # 读取图像
    img = cv2.imread(image_path)
    height, width = img.shape[:2]
    
    # 四边形顶点坐标调整为浮点数,并确保正确的顺序
    src = np.array(pts, dtype=np.float32)
    
    # 目标矩形的顶点坐标,即输出图像的四个角
    dst = np.array([
        [0, 0],
        [output_size[0], 0],
        [output_size[0], output_size[1]],
        [0, output_size[1]]
    ], dtype=np.float32)
    
    # 计算透视变换矩阵
    M = cv2.getPerspectiveTransform(src, dst)
    
    # 执行透视变换
    warped = cv2.warpPerspective(img, M, output_size)
    
    return warped


def calculate_bounding_wh(points):
    """计算四边形的边长"""
    w1 = math.dist(points[0], points[1])
    h1 = math.dist(points[1], points[2])
    w2 = math.dist(points[2], points[3])
    h2 = math.dist(points[3], points[0])
    return int(max(w1,w2)), int(max(h1,h2))


def crop_and_perspective_polygon(image_path, json_path, output_dir=None):
    """根据JSON标注读取不规则四边形 并放射变换为规则矩形图像"""      
    with open(json_path, 'r') as f:
        data = json.load(f)
    
    if not output_dir:
        output_dir = os.path.dirname(image_path)
        
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    for idx, shape in enumerate(data['shapes'], start=1):
        # 确保处理的是不规则四边形
        if len(shape['points']) != 4:
            continue
        label = shape['label']
        # if "ocr_" in label or "smg_" in label:
        if label=="车牌":
            print(shape['points'])
            # 计算最小外包矩形
            w, h = calculate_bounding_wh(shape['points'])
            # 仿射变换
            corrected_image = perspective_transform(image_path, shape['points'], output_size=(w, h))
            # 保存裁剪后的图像
            output_filename = f"{os.path.splitext(os.path.basename(image_path))[0]}_{label}_{idx}_perspective_cropped.jpg"
            output_path = os.path.join(output_dir, output_filename)
            cv2.imwrite(output_path, corrected_image)
            print(f"裁剪完成并保存至: {output_path}")
 
if __name__ == '__main__':
    image_path = '1.jpg'
    json_path = '1.json'
    crop_and_perspective_polygon(image_path, json_path, output_dir="./")

效果图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高校心理咨询管理系统

摘 要 随着高校学生心理问题的增多,心理咨询服务在高校中的重要性日益凸显。然而,传统的心理咨询管理方式存在着诸多问题,如信息不透明、咨询师资源不足等。为了解决这些问题,本文设计并实现了一种基于Java Web的高校心理咨询管理…

Java Stream API揭秘:掌握List流操作,打造高效数据处理流程

序言 Java Stream API是Java 8中引入的一个非常重要的功能组成部分,它提供了一种声明式的处理数据集合的方法。它主要特点是基于函数式编程的理念,允许我们以更加简洁、高效的方式进行集合的处理、转换和过滤。通过Stream API,我们可以灵活地…

Animate软件为什么默认只能导出mov格式视频?

很多同学在学习Animate软件的时候,经常会有一个问题,就是制作好动画导出视频时,只能选择mov格式,而且导出文件特别大,为什么Animate软件默认只能导出mov格式的视频呢?这里简单说一下自己的看法。 首先&…

打破数据分析壁垒:SPSS复习必备(十)

Means过程 统计学上的定义和计算公式 定义:Means过程是SPSS计算各种基本描述统计量的过程,其实就是按照用户指定条件,对样本进行分组计算均数和标准差,如按性别计算各组的均数和标准差。 用户可以指定一个或多个变量作为分组变…

分布式系统:常见的陷阱和复杂性

分布式系统的复杂性是工程师和开发人员面临的重要挑战。复杂性往往会随着系统的发展而增加,因此积极主动非常重要。让我们来谈谈您可能会遇到哪些类型的复杂性以及在工作中应对它的有效策略。 分布式系统和复杂性 在开发中,分布式系统是相互连接并执行…

文华wh6均线交易策略多空波段止盈止损提示主图指标公式源码

文华wh6均线交易策略多空波段止盈止损提示主图指标公式源码&#xff1a; EMA120:EMA(C,120); RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100; K:SMA(RSV,3,1); D:SMA(K,3,1); J:3*K-2*D; DRAWTEXT(C>EMA120&&J<0,L,多),VALIGN0; DRAWTEXT(C<EMA…

01_02_Mybatis的配置文件与基于XML的使用

1、引入日志 在这里我们引入SLF4J的日志门面&#xff0c;使用logback的具体日志实现&#xff1b;引入相关依赖&#xff1a; <!--日志的依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…

基于LangChain搭建个人知识库

前言 &#x1f63a;Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#xff0c;&#x1f600;&#x1f600; 一名热爱AI技术的GIS开发者&#xff1b;在上一篇文章中&#xff0c;我们学习了LLM API的申请、应用以及提示词工程&#xff1b; 在本文中&#xff0c;作者将介绍如…

观测云 VS 开源自建

观测云是一款面向全技术栈的监控观测一体化产品方案&#xff0c;具备强大而丰富的功能&#xff0c;目标是帮助最终用户提升监控观测的能力&#xff0c;化繁为简&#xff0c;轻松的构建起完整的监控观测体系。同时能够帮助整个企业的开发技术团队从统一的观测能力上获得完整的收…

机器学习辅助的乙醇浓度检测(毕设节选)

目录 1.为什么要机器学习 2. 神经网络一般组成 3.BP神经网络工作过程 4.评价指标 5.实操代码 1.为什么要用机器学习 人工分析大量的谐振模式&#xff0c;建立各种WGM的响应与未知目标之间的关系&#xff0c;是一个很大的挑战。机器学习(ML)能够自行识别全谱的全部特征。作为…

linux高级编程(进程)(1)

进程&#xff1a; 进程的含义? 进程是一个程序执行的过程&#xff0c;会去分配内存资源&#xff0c;cpu的调度 进程分类&#xff1a; 1、交互式进程 2、批处理进程 shell脚本 3、 守护进程 进程与程序的区别&#xff1a; 1&#xff09;程序是…

古文字识别笔记

前置知识 部件&#xff1a;大部分的汉字是由若干组笔画结构拼合而成的&#xff0c;这些相对独立的笔画结构称为「部件」。 部件是大于基本笔画&#xff08;例如&#xff1a;点、横、撇、捺等&#xff09;而小于或等同于 偏旁 的结构单位。 例如「测」字有三个部件&#xff1a;…

Qt开发 | Qt控件 | QTabWidget基本用法 | QListWidget应用详解 | QScrollArea应用详解

文章目录 一、QTabWidget基本用法二、QListWidget应用详解1.列表模式1.1 基本操作1.2 添加自定义item1.3 如何添加右键菜单1.4 QListWidget如何删除item 2.图标模式 三、QScrollArea应用详解 一、QTabWidget基本用法 QTabWidget 是 Qt 框架中的一个类&#xff0c;它提供了一个选…

微深节能 堆取料机动作综合检测系统 格雷母线

系统描述&#xff1a; 格雷母线高精度位移测量系统&#xff0c;包括格雷母线、天线箱、地址解码器、地址编码器四个部分组成。 格雷母线类似一把有刻度的尺子&#xff0c;沿着移动机车运行轨道方向上铺设&#xff0c;格雷母线长度可以根据工程需要长度来定制。天线箱类似指针&a…

企智汇软件:机电工程项目管理系统智能化管理,洞悉项目全貌!

在机电工程领域&#xff0c;项目管理的复杂性要求系统不仅要能够处理大量的数据和信息&#xff0c;还要能够提供实时的洞察和分析&#xff0c;以支持快速而明智的决策。企智汇机电工程项目管理系统正是为了满足这些需求而设计的&#xff0c;它通过一系列先进的功能&#xff0c;…

Vue-Ci搭建项目

项目创建 vue-cli 官方提供的一个脚手架,用于快速生成一个vue的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速; 主要的功能 ● 统一的目录结构 ● 本地调试 热部署 ● 单元…

教师资格证考试笔试报名流程

文章目录 前言笔试报名流程一、登录官网二、选择报考省份三、注册报名账号四、确认考试承诺五、填报个人信息六、上传个人照片七、查看个人信息八、笔试报名九、等待审核十、考试缴费最后&#xff08;必看&#xff09;附录1. 中小学教师资格考试网2. 广东省教资笔试报名通知&am…

ChatGPT在程序开发中的应用:提升生产力的秘密武器

在当今飞速发展的科技时代&#xff0c;程序开发已经成为许多企业和个人必不可少的技能。然而&#xff0c;编写代码并非总是顺风顺水&#xff0c;面对复杂的算法、繁琐的调试、持续不断的需求变更&#xff0c;程序员们常常感到压力山大。在这种情况下&#xff0c;ChatGPT应运而生…

像素流送技术,潜力巨大还是功能不足?

像素流送技术作为UE引擎自带的一款扩展性模块&#xff0c;尽管这项技术拥有一定的潜力&#xff0c;但与市场上成熟的云推流产品相比&#xff0c;它在配套功能方面仍显薄弱。 都有哪些具体表现呢&#xff1f; 一、维护和更新成本高 像素流送云推流需要开发团队在研发阶段投入…

五子棋纯python手写,需要的拿去

import pygame,sys from pygame import * pygame.init()game pygame.display.set_mode((600,600)) gameover False circlebox [] # 棋盘坐标点存储 box [] def xy():for x in range(0,800//40): for y in range(0,800//40): box.append((x*40,y*40)) xy() defaultColor wh…