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

news/2024/7/11 1:52:11 标签: python, opencv, 开发语言, 目标检测, YOLO

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

  • 前言
  • 前提条件
  • 相关介绍
  • 实验环境
  • 剪裁图片并修改对应的Labelme标注文件
    • 代码实现

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

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入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">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-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开源项目

http://www.niftyadmin.cn/n/5123471.html

相关文章

蓝桥云课--1024 第 2 场算法双周赛

2-铺地板【算法赛】&#xff08;找规律&#xff09; 一、题目要求 二、思路 &#xff08;1&#xff09;因为每块地砖都是2*3的规格&#xff1a; 1.n<2或者m<2的时候&#xff0c;则不能使用上述规格的瓷砖 No 2.n<3或者m<3的时候&#xff0c;也不能使用上述规格…

使用 ionic + cordova + vue3 实现相册选择、拍照,并上传、预览图片

目录 1.上传组件 upload.vue 1.1 模板规划 1.2 点击添加按钮 1.2.1 实现询问弹框 1.2.2 实现拍照 1.2.3 实现相册选择 1.2.4 实现文件上传 1.2.5 校验图片类型并上传 1.2.6 获取图片列表 1.2.7 在组件内 添加图片附件 2.图片放大组件 enlarge-image.vue 2.1 点击图…

使用DISM 删除系统的保留空间

起因&#xff1a; 系统盘剩余空间不足了...右击WIN目录40G...发现win系统有保留空间 解决方案: 使用DISM 关闭系统保留空间 DISM.exe /Online /Set-ReservedStorageState /State:Disabled

uboot通过图像化界面配置 dns命令验证

一. 简介 上一篇文章学习&#xff0c;如何如何通过图形化界面来配置 uboot使能 dns 命令。地址如下&#xff1a; uboot通过图像化界面配置 dns命令-CSDN博客 本文烧写 uboot到开发板&#xff0c; 验证 DNS命令是否可用。 DNS&#xff1a; 是一个域名解析功能。即可以通过 网…

盘点国产ChatGPT十大模型

什么是ChatGPT ChatGPT是一种基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的聊天机器人。GPT是一种基于深度学习的自然语言处理模型&#xff0c;它使用了Transformer架构来处理文本数据。GPT模型通过在大规模文本数据上进行预训练&#xff…

ASO优化之通过页面的优化来提升排名

应用商店优化是一个持续优化应用列表的过程&#xff0c;从而让我们的应用更容易被目标受众发现。通过实施ASO&#xff0c;我们可以在竞争激烈的应用市场中有效竞争&#xff0c;并为我们的应用带来自然流量。 1、添加关键词。 进行关键词研究&#xff0c;从而确定与应用程序功能…

Redis之Lua脚本讲解

这里写自定义目录标题 1 Lua1.1 简介1.1.1 注释1.1.2 变量1.1.3 数据类型1.1.4 控制结构1.1.5 函数1.1.6 模块1.1.7 字符串操作1.1.8 错误处理1.1.9 标准库 1.2 Redis和Lua脚本结合优点1.3 Lua脚本应用和调试1.3.1 缓存更新1.3.2 原子操作1.3.3 数据处理1.3.4 分布式锁1.3.5 Re…

OpenCV #以图搜图:均值哈希算法(Average Hash Algorithm)原理与实验

1. 介绍 均值哈希算法&#xff08;Average Hash Algorithm&#xff09; 是哈希算法的一种&#xff0c;主要用来做相似图片的搜索工作。 2. 原理 均值哈希算法&#xff08;aHash&#xff09;首先将原图像缩小成一个固定大小的像素图像&#xff0c;然后将图像转换为灰度图像&am…