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的判断语句模拟三目运算
Apr 24 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
python print 按逗号或空格分隔的方法
May 02 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
Python中super函数用法实例分析
Mar 18 Python
numpy实现神经网络反向传播算法的步骤
Dec 24 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
Feb 13 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
在pycharm中无法import所安装的库解决方案
May 31 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笔记之常用文件操作
2010/10/12 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
常用PHP封装分页工具类
2017/01/14 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
对python中的logger模块全面讲解
2018/04/28 Python
python实现126邮箱发送邮件
2020/05/20 Python
师范生自荐信范文
2013/10/06 职场文书
怎么写好自荐信
2013/10/30 职场文书
高三自我评价
2014/02/01 职场文书
公司开会通知
2015/04/20 职场文书
反邪教教育心得体会
2016/01/15 职场文书