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 相关文章推荐
详解在Python和IPython中使用Docker
Apr 28 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
python套接字流重定向实例汇总
Mar 03 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
TensorFlow Session会话控制&amp;Variable变量详解
Jul 30 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
python使用selenium实现批量文件下载
Mar 11 Python
Python字典对象实现原理详解
Jul 01 Python
如何使用python传入不确定个数参数
Feb 18 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
Python with语句用法原理详解
Jul 03 Python
Django Auth用户认证组件实现代码
Oct 13 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
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
Javascript !!的作用
2008/12/04 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 图片验证码代码
2008/12/07 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
培训主管的岗位职责
2013/11/23 职场文书
给面试官的感谢信
2014/02/01 职场文书
班级课外活动总结
2014/07/09 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书