三分钟教会你用Python+OpenCV批量裁剪xml格式标注的图片

yizhihongxing

下面是详细的攻略:

概述

本文将介绍如何使用Python和OpenCV库,批量裁剪xml格式标注的图片,以及如何将裁剪好的图片和对应的标注信息保存在指定文件夹中。

环境

在使用本文中的代码前,需要安装以下环境:

  • Python 3.x
  • OpenCV-Python 库
  • lxml 库

步骤

  1. 读取标注信息

首先要解析xml格式的标注文件,读取每张图片中目标的标注信息,使用lxml库可以轻松完成。

``` python
# 导入lxml库,解析xml文件
from lxml import etree

# 读取标注文件
def read_xml(xml_path):
xml = etree.parse(xml_path).getroot()
# 获取所有图片对象
items = xml.findall('object')
# 存储标注信息,每个元素是一个字典,包含坐标、类别等信息
objs = []
for obj in items:
obj_bbox = obj.find('bndbox')
# 存储xmin, ymin, xmax, ymax这四个坐标值
bbox = [int(obj_bbox.find('xmin').text),
int(obj_bbox.find('ymin').text),
int(obj_bbox.find('xmax').text),
int(obj_bbox.find('ymax').text)]
# 存储类别,这里默认是person
title = obj.find('name').text.lower().strip()
if title == '':
title = 'person'
objs.append({'bbox': bbox, 'title': title})
return objs
```

  1. 读取图片信息

读取图片信息可以使用OpenCV-Python库中的cv2.imread()方法,同时注意把图片大小调整为处理后的大小。

``` python
# 导入OpenCV-Python库,读取图片
import cv2

# 读取图片
def read_image(img_path):
img = cv2.imread(img_path)
# 处理后的图片大小,这里默认是100 * 100
dst = cv2.resize(img, (100, 100), interpolation=cv2.INTER_LINEAR)
return dst
```

  1. 裁剪图片

根据标注信息,将每个目标区域对应的原图切割出来。这里利用cv2库,使用函数cv2.rectangle()和cv2.crop()完成。

python
# 裁剪图片
def crop_image(image, bbox):
# 先画出bbox矩形框
xmin, ymin, xmax, ymax = bbox
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 0, 255), 2)
# 再进行切割
cropped = image[ymin:ymax, xmin:xmax]
return cropped

  1. 保存图片和标注

将裁剪好的图片和对应的标注信息保存到指定文件夹中,可以使用Python自带的os模块。

``` python
# 导入os库,保存图片和标注
import os

# 保存图片和标注
def save_crop(image, objs, save_dir, img_name):
if not os.path.exists(save_dir):
os.makedirs(save_dir)
# 遍历所有目标,分别进行裁剪和保存
for idx, obj in enumerate(objs):
bbox = obj["bbox"]
title = obj["title"]
# 切割后的图片名称
new_img_name = f'{title}{idx}{img_name}'
# 保存crop_image函数返回的结果
cv2.imwrite(os.path.join(save_dir, new_img_name), crop_image(image, bbox))
# 保存标注信息到txt文件中
with open(os.path.join(save_dir, f"{title}_{img_name}.txt"), 'w') as f:
print(title, bbox, file=f)
```

  1. 批量裁剪

最后,使用以上方法读取并处理标注信息和图片,遍历所有图片并进行批量裁剪,详情请参考以下示例。

python
# 批量裁剪
def batch_crop(img_dir, xml_dir, save_dir):
for img_name in os.listdir(img_dir):
# 获取图片路径和对应的标注路径
img_path = os.path.join(img_dir, img_name)
xml_path = os.path.join(xml_dir, img_name.replace(".jpg", ".xml"))
# 读取图片和标注信息
image = read_image(img_path)
objs = read_xml(xml_path)
# 切割图片,并保存图片和标注
save_crop(image, objs, save_dir, img_name)

示例

我们可以使用VOC2007数据集中的一些图片和标注文件进行实验。以下是两个实例:

  1. 单张图片裁剪

如下代码是单张图片的裁剪,将图片命名为a.jpg,标注文件为a.xml。

``` python
img_dir = './VOC2007/JPEGImages'
xml_dir = './VOC2007/Annotations'
save_dir = './crop_image'
img_name = 'a.jpg'
xml_name = 'a.xml'

img_path = os.path.join(img_dir, img_name)
xml_path = os.path.join(xml_dir, xml_name)

image = read_image(img_path)
objs = read_xml(xml_path)
save_crop(image, objs, save_dir, img_name)
```

  1. 批量裁剪

如下代码是批量进行裁剪,将所有VOC2007数据集中的jpg图片进行裁剪。

``` python
img_dir = './VOC2007/JPEGImages'
xml_dir = './VOC2007/Annotations'
save_dir = './crop_image'

# 批量裁剪
batch_crop(img_dir, xml_dir, save_dir)
```

由于裁剪后的结果已经保存在指定文件夹中,我们可以使用其他的工具对这些裁剪后的图片进行分类训练等操作,不过这已经超出了本文的范畴。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:三分钟教会你用Python+OpenCV批量裁剪xml格式标注的图片 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python3读取Excel数据存入MySQL的方法

    当我们需要将Excel表格中的数据存入MySQL数据库中时,可以通过Python的pandas和pymysql库实现。 下面是具体步骤: 准备工作 安装相关库 pip install pandas pip install pymysql 创建一个MySQL数据库并创建表 在MySQL中执行以下语句 CREATE DATABASE test_db; 创建表 U…

    python 2023年6月3日
    00
  • 记录Python脚本的运行日志的方法

    当我们编写Python脚本时,经常需要记录程序的运行日志,用来追踪程序的执行过程,排除问题和调试程序。以下是记录Python脚本的运行日志的方法的完整攻略,具体包含以下几个部分: 第一步:引入日志模块 Python自带了一个logging模块用来记录日志。因此,我们需要先导入logging模块,并设置日志输出级别,一般情况下,我们推荐使用DEBUG、INFO…

    python 2023年6月3日
    00
  • Python调用ctypes使用C函数printf的方法

    当使用Python开发项目时,有时候需要使用C语言编写的库或者扩展,为了能够使用这些C语言编写的库或者扩展,Python提供了一种名为ctypes的标准库。在使用ctypes的过程中,调用C函数printf是一项非常基础的操作。下面是Python调用ctypes使用C函数printf方法的完整攻略。 1. 需求分析 在开始编码之前,我们应该先梳理一下需求,确…

    python 2023年6月5日
    00
  • ModuleNotFoundError:即使在破解 sys.path() 之后,python 3 中也没有命名模块

    【问题标题】:ModuleNotFoundError: No module named in python 3 even after hacking sys.path()ModuleNotFoundError:即使在破解 sys.path() 之后,python 3 中也没有命名模块 【发布时间】:2023-04-03 09:45:02 【问题描述】: 我有…

    Python开发 2023年4月8日
    00
  • Python映射类型之dict详解

    Python映射类型之dict详解 简介 dict是Python内置的一种映射类型,也叫字典,是一个键值对的无序集合。这里的“键”必须是唯一的。 定义和初始化 定义一个空的字典: d = {} 初始化一个字典: d = {‘name’: ‘张三’, ‘age’: 20} 也可以使用dict()函数初始化: d = dict(name=’张三’, age=20…

    python 2023年5月13日
    00
  • 用Python实现一个简单的用户系统

    简介 在本文中,我们将使用Python编写代码来实现一个简单的用户系统。我们将会使用Python的Flask框架来搭建Web应用程序,在应用程序中创建用户并存储在SQLite数据库中,同时允许用户进行登录和注销操作。 准备工作 在开始之前,我们需要确保已经安装了Python和Flask框架。如果你还没有安装,建议按照官方文档进行安装。 数据库设计 首先,我们…

    python 2023年5月13日
    00
  • Python requests.post方法中data与json参数区别详解

    以下是关于Python requests.post方法中data与json参数区别的攻略: Python requests.post方法中data与json参数区别详解 在Python的requests库中,post方法中有两个常用的参数:data和json。这两个参数都可以用来传递POST请求的数据,但是它们的使用方式和传递的数据格式有所不同。以下是Pyt…

    python 2023年5月14日
    00
  • 【NLP教程】用python调用百度AI开放平台进行情感倾向分析

    目录 一、背景 二、操作步骤 2.1 创建应用 2.2 获取token 2.3 情感倾向分析 三、其他情感分析 四、讲解视频 一、背景 Hi,大家!我是 @马哥python说 ,一名10年程序猿。 今天我来演示一下:通过百度AI开放平台,利用python调用百度接口进行中文情感倾向分析,并得出情感极性分为积极、消极还是中性以及置信度结果。 二、操作步骤 首先…

    python 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部