Python OpenCV剪裁图片并修改对应的Labelme标注文件

这篇具有很好参考价值的文章主要介绍了Python OpenCV剪裁图片并修改对应的Labelme标注文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO
Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO
Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO
Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

前提条件

  • 熟悉Python

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
  • OpenCV用C++语言编写,它具有C++、Python、Java和MATLAB接口,并支持Windows、Linux、Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令。

实验环境

  • Python 3.x (面向对象的高级语言)

剪裁图片并修改对应的Labelme标注文件

  • 背景:某些场景下,获取到的已经标注的图片数据,有黑色边框,本文目的则是,将图片数据的黑色边框剔除掉,并同步修改已标注的图片数据对应的Labelme标注文件,方便后续使用。
  • 项目结构
    Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO

Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO
Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO

Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO

代码实现

import os
import cv2
import json
import numpy as np

def xyxy2xywh(rect):
    '''
    (x1,y1,x2,y2) -> (x,y,w,h)
    '''
    return [rect[0],rect[1],rect[2]-rect[0],rect[3]-rect[1]]

def xywh2xyxy(rect):
    '''
    (x,y,w,h) -> (x1,y1,x2,y2)
    '''
    return [rect[0],rect[1],rect[0]+rect[2],rect[1]+rect[3]]

def xyxy2xminyminxmaxymax(rect):
    xmin = min(rect[0],rect[2])
    ymin = min(rect[1],rect[3])
    xmax = max(rect[0],rect[2])
    ymax = max(rect[1],rect[3])
    return [xmin,ymin,xmax,ymax]

def alter_json(img_name,in_json_path,out_json_path,crop_x,crop_y,crop_height,crop_width,pad):
    '''
    in_json_path: json文件输入路径
    out_json_path: json文件保存路径
    crop_x : 剪裁矩阵坐标的x
    crop_y : 剪裁矩阵坐标的y
    crop_height: 剪裁后的高
    crop_width: 剪裁后的宽
    pad: 图片填充数
    '''
    file_in = open(in_json_path, "r", encoding='utf-8')
    # json.load数据到变量json_data
    json_data = json.load(file_in)
    # 修改json中的内容
    json_data["imageHeight"] = crop_height
    json_data["imageWidth"] = crop_width + 2*pad
    json_data["imagePath"] = img_name
    json_data["imageData"] = None
    # 读取原始jsons的 [[x1,y1],[x2,y2]]
    for LabelBox in json_data['shapes']:
        points = LabelBox['points']
        points[0][0] = points[0][0] - crop_x + pad
        points[0][1] =points[0][1] - crop_y 
        points[1][0] = points[1][0] - crop_x + pad
        points[1][1] = points[1][1] - crop_y 
    file_in.close()

    # 创建一个写文件
    file_out = open(out_json_path, "w", encoding='utf-8')
    # 将修改后的数据写入文件
    file_out.write(json.dumps(json_data))
    file_out.close()

# 图像显示函数
def show(name, img):
    cv2.namedWindow(name, 0)  # 用来创建指定名称的窗口,0表示CV_WINDOW_NORMAL
    # cv2.resizeWindow(name, img.shape[1], img.shape[0]); # 设置宽高大小为640*480
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def crop_largest_img(image):
    '''
    参数:
        image 是彩色图像数组。
    '''
    # 转换为灰度图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 二值化
    _, binary = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)
    # show('binary',binary)

    # 查找轮廓
    contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
    '''
    retval = cv2.boundingRect( cnt )

    参数:
        cnt 是灰度图像或轮廓。
    返回值:
        retval 表示返回的矩形边界的左上角顶点的坐标值及矩形边界的宽度和高度,即x,y,w,h
    '''
    for cnt in contours:
        x,y,w,h = cv2.boundingRect(cnt) # 获取轮廓顶点及边长
        if w*h<600*600: # 过滤掉小于600*600的矩形框
            continue
        # print(x,y,w,h) # 570 126 1039 728 左上角x 左上角y 框宽 框高
        # cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),10) # xmin,ymin,xmax,ymax
    # show('image',image)
    return x,y,w,h


if __name__=="__main__":
    # 输出图片所在文件夹
    out_imgs_dir  = 'out_images/'
    # 输出jsons所在文件夹
    out_jsons_dir = 'out_jsons/'
    if not os.path.exists(out_imgs_dir):
        os.mkdir(out_imgs_dir)
    if not os.path.exists(out_jsons_dir):
        os.mkdir(out_jsons_dir)

    # 输入图片所在文件夹
    in_imgs_dir  = 'images/'
    # 输入jsons所在文件夹
    in_jsons_dir = 'jsons/'
    # 输入图片名列表
    file_name_list = os.listdir(in_imgs_dir)
    img_name_list = [i for i in file_name_list if i.endswith('.png')]
    # 输入jsons文件名列表
    file_name_list = os.listdir(in_jsons_dir)
    json_name_list = [i for i in file_name_list if i.endswith('.json')]
    # print(img_name_list,json_name_list)

    # 定义剪裁图片的左右填充数
    pad = 0

    for img_name,json_name in zip(img_name_list,json_name_list):
        in_img_path = os.path.join(in_imgs_dir,img_name)
        out_img_path = os.path.join(out_imgs_dir,img_name)
        in_json_path = os.path.join(in_jsons_dir,json_name)
        out_jsons_path = os.path.join(out_jsons_dir,json_name)
        # print(in_img_path,in_json_path)
        # 读取图片
        image = cv2.imread(in_img_path)
        # 获得最大剪裁矩形坐标(x,y,w,h)
        x,y,w,h = crop_largest_img(image)
        # print(x,y,w,h)
        # 读取并修改json文件
        alter_json(img_name,in_json_path,out_jsons_path,x,y,h,w,pad=pad)
        # 保存剪裁图片
        crop_img = image[y:y+h,x-pad:x+w+pad] # h,w

        cv2.imwrite(out_img_path,crop_img)

Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO
Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO
Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO
Python OpenCV剪裁图片并修改对应的Labelme标注文件,Python日常小操作,OpenCV-Python小应用,python,opencv,开发语言,目标检测,YOLO文章来源地址https://www.toymoban.com/news/detail-719884.html

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

到了这里,关于Python OpenCV剪裁图片并修改对应的Labelme标注文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用labelme标注矩形框和关键点得到的json文件转txt格式用于yolov5-face训练

    目录 我用labelme标注完的json文件长这样:标注了两种:矩形框和点 我要转换的txt格式长这样: json格式转txt如下: 从txt查看标注结果 参考的这位博主并在此基础上做了改动。(484条消息) LabelMe 标注的json转txt的格式转换教程_无损检测小白白的博客-CSDN博客 我用labelme标注完的

    2024年02月12日
    浏览(35)
  • Labelme使用——数据集标注详解

     1、Labelme的安装: Windows下首先安装Anaconda,安装教程:Windows下Anaconda的下载与安装_一诺长安的博客-CSDN博客 安装成功后,电计电脑左下角“开始”,找到Anaconda3(64-bit )下的Anaconda Prompt,并打开。  查看python版本:输入python或者python -V  创建虚拟环境:conda create -n labelm

    2024年02月08日
    浏览(31)
  • Labelme分割标注的使用(非常好)

    博客转自于: Labelme分割标注软件使用 这里建议大家按照我提供的目录格式事先准备好数据,然后在该根目录下启动labelme( 注意 启动目录位子,因为标注json文件中存储的图片路径都是以该目录作为相对路径的) 1.1 创建label标签文件 虽然在labelme中能够在标注时添加标签,但

    2024年01月22日
    浏览(30)
  • PaddleDetect图像目标检测模型训练之数据标注——使用labelme进行标注

    在做PaddleDetect图像检测模型训练时,需要对数据集进行人工标注,下面将已货车检测为例,使用labelme进行标注的详细过程记录一下,以防日后忘记。 本文中使用到的文件请到这里下载:https://download.csdn.net/download/loutengyuan/87616492 labelme是图形图像注释工具,它是用Python编写的

    2024年02月16日
    浏览(32)
  • 如何将labelme生成的json文件转换成png图片(亲测有效)

    单个转换(费时) 1.先进入到你存放json的文件夹的磁盘中,输入d: 2. 激活labelme环境 3. 输入labelme_json_to_dataset并进入到存放json的文件夹 4.完成转换 批量转换(等我更新) 更新来啦!!!(步骤) 1、修改json_to_dataset.py代码 这里它的地址为D:Anaconda3envslabelmeLibsite-packageslabe

    2024年02月13日
    浏览(30)
  • OpenCV找出图片中的圆并标注圆心

    案例:输入一张图片找到图片中的一个圆,并标注圆心 实现步骤: 1.输入原图 2.图像图像灰度化 3.图像二值化 4.执行形态学操作去除噪点 5.边缘检测 6.轮廓发现 7.根据面积和纵横比过滤目标轮廓 8.找出圆心并绘制圆心 9.在原图上也绘制圆心并输出   本文福利, 莬 费领取Qt开

    2024年02月11日
    浏览(27)
  • ubuntu20.04系统安装使用labelme标注数据集

    请参考:Mediapipe+VSCode+Anaconda 实时检测手部关键点并保存视频_苦瓜汤补钙的博客-CSDN博客 1.打开终端创建虚拟环境   输入“y”,然后回车。  2.激活虚拟环境,开始安装  1、启动 2、点击【open】,选择图片;【Edit Polygons】---- 【Create Polygons】  3、可以选择自动保存  

    2024年02月16日
    浏览(35)
  • VOC/YOLO/COCO数据集格式转换及LabelImg/Labelme/精灵标注助手Colabeler标注工具介绍

    数据集格式:VOC(xml)、YOLO(txt)、COCO(json) 本文主要对 Label格式 ,以及 LabelImg、Labelme、精灵标注助手Colabeler 这常用的三种数据标注软件进行介绍。 LabelImg是目标检测数据标注工具,可以标注标注两种格式: VOC标签格式,标注的标签存储在xml文件 YOLO标签格式,标注的标签存储在

    2023年04月22日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包