三分钟教会你用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 中pandas.read_excel详细介绍

    以下是“Python中pandas.read_excel详细介绍”的完整实例教程。 一、read_excel函数简介 首先,需要明确的是,pandas库是Python数据分析的中心库之一,提供了许多用于数据处理的函数,包括read_excel函数,它允许用户读取Excel文件并将其转换为DataFrame对象。read_excel()是pandas的一个函数…

    python 2023年5月13日
    00
  • Python实现的拉格朗日插值法示例

    下面是详细讲解“Python实现的拉格朗日插值法示例”的完整攻略。 1. 什么是拉格朗日插值法 拉格朗日插值法是一种通过已知数据点来估计未知数据点的方法。它基于拉格朗日多项式,通过构造一个多项式函数来逼近原始数据,从而实现插值。 2. 拉格朗日插值法原理 假设有n数据点$(x_1,y_1),(x_2,y_2),…,(x_n,y_n)$,其中$x_i$互不…

    python 2023年5月14日
    00
  • python爬虫刷访问量 2019 7月

    Python爬虫是一种可以自动化模拟浏览器行为获取网页数据的技术,所以如果想要刷访问量,可以使用Python爬虫来实现。下面是一个完整的攻略以及两条示例说明。 一、前置知识 在实现Python爬虫之前,需要了解以下知识点: HTTP协议:了解HTTP请求和响应的格式,以及常见的状态码和内容类型。 HTML语法:了解HTML标签和结构,以及常见的CSS和Jav…

    python 2023年5月14日
    00
  • python遍历文件目录、批量处理同类文件

    当我们需要处理大量的文件时,手动处理会变得非常繁琐和耗时。而使用Python遍历文件目录和批量处理同类文件,可以大量提高处理效率,提高工作效能。下面将给出详细的攻略。 1. 遍历文件目录 使用os模块遍历文件目录 使用os模块可以实现遍历文件目录的功能,os模块是Python内置的提供访问操作系统功能的模块,可以操作文件、文件夹和进程等。 首先看下列使用os…

    python 2023年6月5日
    00
  • python 线程的五个状态

    Python线程的五个状态包括: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 终止状态(Terminated) 下面我们按照状态的顺序,详细讲解每一个状态及其相应的操作。 1. 新建状态(New) 新建状态是线程被创建后进入的状态。在新建状态中,子线程是无法运行的。需要通过调用start()方法进…

    python 2023年5月13日
    00
  • python 如何用map()函数创建多线程任务

    下面是关于“Python如何用map()函数创建多线程任务”的攻略: 什么是map()函数 在Python中,map()函数是一种对集合中的所有元素执行某种操作的方法,它能够方便地将一种操作应用到一个集合中的所有成员。map()函数的语法如下: map(function, iterable, …) 其中,function代表要对集合中每个元素执行的操作,…

    python 2023年5月18日
    00
  • matplotlib共享坐标轴的实现(X或Y坐标轴)

    要实现matplotlib共享坐标轴,可以使用fig.add_subplot() 和 plt.subplots() 函数,这两个函数都支持共享坐标轴。 共享x轴的实现:我们可以声明一个figure,然后使用add_subplot()函数添加需要的子图,同时指定sharex参数用来共享x轴。代码如下: import matplotlib.pyplot as p…

    python 2023年5月18日
    00
  • Python datetime模块使用方法小结

    Python datetime模块是Python中用于处理日期和时间的标准库。这个模块提供了许多在日期和时间处理方面非常有用的类、函数和常量。 在使用datetime模块之前,我们需要先引入该模块。可以使用以下代码来导入datetime模块: import datetime 1. datetime的构造函数 datetime模块定义了几个类,其中最重要的是d…

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