python 批量生成xml标记文件(连通域坐标分割)
#!/usr/bin/python
# -*- coding=utf-8 -*-
# author : Manuel
# date: 2019-05-15 from xml.etree import ElementTree as ET
import numpy as np
from skimage import data,filters,segmentation,measure,morphology,color
from scipy.misc import imread
import os
from os import getcwd IMAGES_LIST=os.listdir('ls')#图片路径 #连通域分割,返回连通域坐标列表
def connected_domain_position_get(image):
coordinates_list=[]#创建坐标列表
thresh = filters.threshold_otsu(image) # 阈值分割,自动返回一个阈值
bw = morphology.closing(image > thresh,
morphology.square(3)) # (image > thresh, morphology.square(3)) #闭运算#将0,1转换成bool
cleared = bw.copy() # 复制
segmentation.clear_border(cleared) # 清除与边界相连的目标物
label_image = measure.label(cleared) # 连通区域标记
borders = np.logical_xor(bw, cleared) # 逻辑异或
label_image[borders] = -1 # ?
# image_label_overlay = color.label2rgb(label_image, image=image) # 不同标记用不同颜色显示
for region in measure.regionprops(label_image): # 循环得到每一个连通区域属性集
# 忽略小区域
if region.area < 1000:
continue
# print(region.bbox)
# 绘制外包矩形
minr, minc, maxr, maxc = region.bbox
# rect = mpatches.Rectangle((minc - 10, minr - 10), maxc - minc + 20, maxr - minr + 20,
# fill=False, edgecolor='red',
# linewidth=2) # mpatches.Rectangle(矩形左上顶点坐标(x,y), width, height)
left = minc - 10
upper = minr - 10
right = maxc + 10
lower = maxr + 10
coordinates_list.append([left,upper,right,lower])#将每组连通域坐标添加进坐标列表
return coordinates_list#返回连通域坐标列表 #创建一级分支object
def create_object(root,xi,yi,xa,ya):#参数依次,树根,xmin,ymin,xmax,ymax
#创建一级分支object
_object=ET.SubElement(root,'object')
#创建二级分支
name=ET.SubElement(_object,'name')
name.text='AreaMissing'
pose=ET.SubElement(_object,'pose')
pose.text='Unspecified'
truncated=ET.SubElement(_object,'truncated')
truncated.text=''
difficult=ET.SubElement(_object,'difficult')
difficult.text=''
#创建bndbox
bndbox=ET.SubElement(_object,'bndbox')
xmin=ET.SubElement(bndbox,'xmin')
xmin.text='%s'%xi
ymin = ET.SubElement(bndbox, 'ymin')
ymin.text = '%s'%yi
xmax = ET.SubElement(bndbox, 'xmax')
xmax.text = '%s'%xa
ymax = ET.SubElement(bndbox, 'ymax')
ymax.text = '%s'%ya #创建xml文件
def create_tree(image_name):
global annotation
# 创建树根annotation
annotation = ET.Element('annotation')
#创建一级分支folder
folder = ET.SubElement(annotation,'folder')
#添加folder标签内容
folder.text=('ls') #创建一级分支filename
filename=ET.SubElement(annotation,'filename')
filename.text=image_name.strip('.jpg') #创建一级分支path
path=ET.SubElement(annotation,'path')
path.text=getcwd()+'/ls/%s'%image_name#用于返回当前工作目录 #创建一级分支source
source=ET.SubElement(annotation,'source')
#创建source下的二级分支database
database=ET.SubElement(source,'database')
database.text='Unknown' #创建一级分支size
size=ET.SubElement(annotation,'size')
#创建size下的二级分支图像的宽、高及depth
width=ET.SubElement(size,'width')
width.text=''
height=ET.SubElement(size,'height')
height.text=''
depth = ET.SubElement(size,'depth')
depth.text = '' #创建一级分支segmented
segmented = ET.SubElement(annotation,'segmented')
segmented.text = '' def main():
for image_name in IMAGES_LIST:
#只处理jpg文件
if image_name.endswith('jpg'):
#将图像通过连通域分割,得到连通域坐标列表,该列表的形式[[a,b,c,d],[e,f,g,h]...,]
image = color.rgb2gray(imread(os.path.join(r'./ls', image_name)))
coordinates_list = connected_domain_position_get(image)
create_tree(image_name) for coordinate_list in coordinates_list:
create_object(annotation, coordinate_list[0], coordinate_list[1], coordinate_list[2], coordinate_list[3])
# if coordinates_list==[]:
# break
# 将树模型写入xml文件
tree = ET.ElementTree(annotation)
tree.write('ls/%s.xml' % image_name.strip('.jpg')) if __name__ == '__main__':
main()
注:xml中所有值必须是字符串,否则报错
python 批量生成xml标记文件(连通域坐标分割)的更多相关文章
- 用python批量生成简单的xml文档
最近生成训练数据时,给一批无效的背景图片生成对应的xml文档,我用python写了一个简单的批量生成xml文档的demo,遇见了意外的小问题,记录一下. 报错问题为:ImportError: No m ...
- php 批量生成html,txt文件的方法(实例代码)
php批量生成html,txt文件的实现代码. 首先,建立一个conn.php 链接数据库. <?php $link = mysql_connect("mysql_host" ...
- dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性
dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性 分类: Java2011-06-03 16:14 976人阅读 评论(0) 收藏 举报 xml扩展语言 今天在开发sitemap地 ...
- 如何用python批量生成真实的手机号码
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python测试社区 1目 标 场 景 平时在工作过程中,偶尔会需要大 ...
- Python批量生成用户名
写在最前 平时在工作中尤其是在做压测的时候难免需要一些用户名和密码,写个简单的Python小脚本批量生成一些 代码示例 import random,string #生成大小字母和数字一起的大字符串 a ...
- python批量生成SQL语句
1,首先写一条能运行成功插入SQL的语句 INSERT INTO sign_guest(realname,phone,email,sign,event_id)VALUES("jack&quo ...
- Python项目生成requirements.txt文件及pip升级问题解决及流程
缘由:新项目使用Python, PC上的python包不全,需要通过requirements.txt文件指定安装所需包 pip安装遇到一些坑 一.直接使用pip包管理工具生成requirements. ...
- java使用jdom生成xml格式文件
本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...
- 批量生成xml文件数据C#实现
方法一 // < Records count = "5" > //< Record > // < Contact_ID > 5 - 55W - ...
随机推荐
- android完美的退出方法
http://blog.csdn.net/get123/article/details/9001214
- Java练习 SDUT-1294_选票统计
选票统计 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 某校学生会主席由全校学生投票选举产生,共有m名候选人报名参选, ...
- linux下重启oracle数据库
如何在linux下重启oracle数据库 | 浏览:3930 | 更新:2013-09-18 19:33 1 2 3 4 5 6 分步阅读 在实际工作项目中,有时候会遇到需要对oracle数据库进行重 ...
- day1_python运算符
运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运算.赋值运算 ...
- 2013-4-3 C#中alt键不是Keys.Alt 而是 Keys.LMenu
2013-4-3 C#中alt键不是Keys.Alt而是Keys.LMenu
- 2018-11-19-win10-uwp-使用-Matrix3DProjection-进行-3d-投影
title author date CreateTime categories win10 uwp 使用 Matrix3DProjection 进行 3d 投影 lindexi 2018-11-19 ...
- Lecture Collection
Distributed ML Yibo Zhu 主要讲了如何分布式的进行机器学习,主要用到的思想是指令的流水调度的相关的思想. IoT Zhenjiang Li 普通的各种卡是基于PIN来进行身份验证 ...
- set和map容器、
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...
- java List接口
Collection子接口: List是有序的集合,集合中每个元素都有对应的顺序序列.List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元素的添加 ...
- UVA 12563 "Jin Ge Jin Qu hao" (背包)
传送门 debug了好一会,突然发现,输出错了,emmm......... 明天再写debug历程: (PS:ipad debug是真的繁琐) 题意: 题解: 尽管题干中给的 t 的范围很大,但是 t ...