Python 读取xml数据,cv2裁剪图片实例


Posted in Python onMarch 10, 2020

下载的数据是pascal voc2012的数据,已经有annotation了,不过是xml格式的,训练的模型是在Google模型的基础上加了两层网络,因此要在原始图像中裁剪出用于训练的部分图像。

另外,在原来给的标注框的基础上,做了点框的移动。最后同类目标存储在同一文件夹中。

from __future__ import division
import os
from PIL import Image
import xml.dom.minidom
import numpy as np
 
ImgPath = 'C:/Users/Desktop/XML_try/img/' 
AnnoPath = 'C:/Users/Desktop/XML_try/xml/'
ProcessedPath = 'C:/Users/Desktop/CropedVOC/'
 
imagelist = os.listdir(ImgPath)
for image in imagelist:
	image_pre, ext = os.path.splitext(image)
	imgfile = ImgPath + image 
	xmlfile = AnnoPath + image_pre + '.xml'
	
	DomTree = xml.dom.minidom.parse(xmlfile)
	annotation = DomTree.documentElement
 
	filenamelist = annotation.getElementsByTagName('filename') #[<DOM Element: filename at 0x381f788>]
	filename = filenamelist[0].childNodes[0].data
	objectlist = annotation.getElementsByTagName('object')
	
	i = 1
	for objects in objectlist:
		
		namelist = objects.getElementsByTagName('name')
		objectname = namelist[0].childNodes[0].data
 
		savepath = ProcessedPath + objectname
 
		if not os.path.exists(savepath):
			os.makedirs(savepath)
 
		bndbox = objects.getElementsByTagName('bndbox')
		cropboxes = []
 
		for box in bndbox:
			x1_list = box.getElementsByTagName('xmin')
			x1 = int(x1_list[0].childNodes[0].data)
			y1_list = box.getElementsByTagName('ymin')
			y1 = int(y1_list[0].childNodes[0].data)
			x2_list = box.getElementsByTagName('xmax')
			x2 = int(x2_list[0].childNodes[0].data)
			y2_list = box.getElementsByTagName('ymax')
			y2 = int(y2_list[0].childNodes[0].data)
 
			w = x2 - x1
			h = y2 - y1
 
			obj = np.array([x1,y1,x2,y2])
			shift = np.array([[0.8,0.8,1.2,1.2],[0.9,0.9,1.1,1.1],[1,1,1,1],[0.7,0.7,1,1],[1,1,1.2,1.2],\
				[0.7,1,1,1.2],[1,0.7,1.2,1],[(x1+w*1/3)/x1,(y1+h*1/3)/y1,(x2+w*1/3)/x2,(y2+h*1/3)/y2],\
				[(x1-w*1/3)/x1,(y1-h*1/3)/y1,(x2-w*1/3)/x2,(y2-h*1/3)/y2]])
 
			XYmatrix = np.tile(obj,(9,1)) 
			cropboxes = XYmatrix * shift
 
			img = Image.open(imgfile)
			for cropbox in cropboxes:
				cropedimg = img.crop(cropbox)
				cropedimg.save(savepath + '/' + image_pre + '_' + str(i) + '.jpg')
				i += 1

补充知识:python-----截取xml文件画框的图片并保存

from __future__ import division
import os
from PIL import Image
import xml.dom.minidom
import numpy as np
ImgPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\output/'
AnnoPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\Annotations/'
ProcessedPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\cut/'

imagelist = os.listdir(ImgPath)

for image in imagelist:
  image_pre, ext = os.path.splitext(image)
  imgfile = ImgPath + image
  print(imgfile)
  if not os.path.exists(AnnoPath + image_pre + '.xml' ):
    continue
  xmlfile = AnnoPath + image_pre + '.xml'
  DomTree = xml.dom.minidom.parse(xmlfile)
  annotation = DomTree.documentElement
  filenamelist = annotation.getElementsByTagName('filename')
  filename = filenamelist[0].childNodes[0].data
  objectlist = annotation.getElementsByTagName('object')
  i = 1
  for objects in objectlist:
    namelist = objects.getElementsByTagName('name')
    objectname = namelist[0].childNodes[0].data
    savepath = ProcessedPath + objectname
    if not os.path.exists(savepath):
      os.makedirs(savepath)
    bndbox = objects.getElementsByTagName('bndbox')
    cropboxes = []
    for box in bndbox:
      x1_list = box.getElementsByTagName('xmin')
      x1 = int(x1_list[0].childNodes[0].data)
      y1_list = box.getElementsByTagName('ymin')
      y1 = int(y1_list[0].childNodes[0].data)
      x2_list = box.getElementsByTagName('xmax')
      x2 = int(x2_list[0].childNodes[0].data)
      y2_list = box.getElementsByTagName('ymax')
      y2 = int(y2_list[0].childNodes[0].data)
      w = x2 - x1
      h = y2 - y1
      obj = np.array([x1,y1,x2,y2])
      shift = np.array([[1,1,1,1]])
      XYmatrix = np.tile(obj,(1,1))
      cropboxes = XYmatrix * shift
      img = Image.open(imgfile)
      for cropbox in cropboxes:
        cropedimg = img.crop(cropbox)
        cropedimg.save(savepath + '/' + image_pre + '_' + str(i) + '.jpg')
        i += 1

以上这篇Python 读取xml数据,cv2裁剪图片实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
Nov 14 Python
python如何在列表、字典中筛选数据
Mar 19 Python
pandas 将索引值相加的方法
Nov 15 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
Python hmac模块使用实例解析
Dec 24 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
python代码xml转txt实例
Mar 10 #Python
Python切割图片成九宫格的示例代码
Mar 10 #Python
pycharm设置python文件模板信息过程图解
Mar 10 #Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 #Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 #Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 #Python
python标准库OS模块详解
Mar 10 #Python
You might like
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
Python制作CSDN免积分下载器
2015/03/10 Python
Python网络编程 Python套接字编程
2017/09/13 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
Aosom西班牙:家具在线商店
2020/06/11 全球购物
小区门卫值班制度
2014/01/24 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
高校教师岗位职责
2014/03/18 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
收银员岗位职责范本
2015/04/07 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
请假条应该怎么写?
2019/06/24 职场文书
js之ajax文件上传
2021/05/13 Javascript
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL