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

下面是详细的攻略:

概述

本文将介绍如何使用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日

相关文章

  • python人工智能tensorflow优化器Optimizer算法汇总

    以下是关于“Python人工智能TensorFlow优化器Optimizer算法汇总”的完整攻略: 简介 在机器学习和深度学习中,优化器是一种常用的算法,它可以通过调整模型的参数,使得模型的损失函数最小化。TensorFlow是一种常用的深度学习框架,它提供了多种优化器算法,本教程将对这些算法进行汇总和介绍。 TensorFlow优化器算法 以下是Tenso…

    python 2023年5月14日
    00
  • Python读取excel中的图片完美解决方法

    以下是Python读取excel中的图片完美解决方法的完整实例教程。 1. 准备工作 首先,我们需要安装 openpyxl、pillow 两个库,这两个库都可以使用 pip 命令进行安装。 pip install openpyxl pillow 2. 读取Excel文件 我们先准备一个包含图片的Excel文件,这里我们以 test.xlsx 为例。读取Exc…

    python 2023年5月14日
    00
  • python利用有道翻译实现”语言翻译器”的功能实例

    下面是Python利用有道翻译实现“语言翻译器”的完整攻略: 1.准备工作 首先需要在“有道智云”网站上申请API Key,获取APP ID和API Key用于在程序中调用翻译功能。 2.安装相关库 Python中使用requests库进行网络请求,使用json库对返回内容进行解析,可以使用以下命令进行安装: pip install requests 3.编…

    python 2023年6月3日
    00
  • Python变量和数据类型详解

    接下来我将详细介绍“Python变量和数据类型详解”的完整攻略。 Python中的变量可以用来存储不同类型的数据,包括数字、字符串、列表、元组等。它是动态类型的语言,因此在创建变量时我们不需要声明它们的类型。 变量的定义和使用 Python中的变量是在使用时被定义的。变量名需要满足一些规则,如: 变量名只能包含字母、数字和下划线。 变量名以字母或下划线开头。…

    python 2023年5月20日
    00
  • python设置中文界面实例方法

    设置Python的中文界面,实际上就是将Python的默认编码设置为UTF-8,同时修改输出流的字符集为UTF-8。这样,Python在输出中文时就能够正确的显示中文字符,避免出现乱码。 下面是具体的步骤: 打开Python交互式界面或在Python脚本中添加以下代码: import sys # 修改输出流字符集 sys.stdout.reconfigure…

    python 2023年5月20日
    00
  • python根据json数据画疫情分布地图的详细代码

    接下来我将为您讲解“python根据json数据画疫情分布地图的详细代码”的完整攻略。 准备工作 首先,需要确保你安装了以下三个库: folium: 用于生成地图 pandas: 用于数据处理 requests: 用于获取网络数据 代码如下: !pip install folium pandas requests 获取数据 获取数据是画疫情分布地图的第一步。…

    python 2023年6月3日
    00
  • Python实现获取本地及远程图片大小的方法示例

    作为网站作者,我们可以提供以下Python实现获取本地及远程图片大小的方法示例: 获取本地图片大小 在Python中,我们可以使用PIL库来操作图片。要获取本地图片大小,可以使用Image.open()方法打开图片,然后使用获取大小属性size: from PIL import Image file_path = "path/to/image.jp…

    python 2023年6月3日
    00
  • 总结python 三种常见的内存泄漏场景

    下面是总结Python三种常见的内存泄漏场景的完整攻略。 1. 引用循环 引用循环是Python内存泄漏最常见的情况之一,也被称为“循环引用”。 基本原理是当存在两个对象,这两个对象在彼此之间存在引用关系,即相互引用,形成了一个环状结构,但是这个环状结构又没有被引用指向,这时就会发生引用循环,导致内存泄漏。 示例代码: class Person: def _…

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