#!/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标记文件(连通域坐标分割)的更多相关文章

  1. 用python批量生成简单的xml文档

    最近生成训练数据时,给一批无效的背景图片生成对应的xml文档,我用python写了一个简单的批量生成xml文档的demo,遇见了意外的小问题,记录一下. 报错问题为:ImportError: No m ...

  2. php 批量生成html,txt文件的方法(实例代码)

    php批量生成html,txt文件的实现代码. 首先,建立一个conn.php 链接数据库. <?php $link = mysql_connect("mysql_host" ...

  3. dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性

    dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性 分类: Java2011-06-03 16:14 976人阅读 评论(0) 收藏 举报 xml扩展语言 今天在开发sitemap地 ...

  4. 如何用python批量生成真实的手机号码

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python测试社区 1目 标 场 景 平时在工作过程中,偶尔会需要大 ...

  5. Python批量生成用户名

    写在最前 平时在工作中尤其是在做压测的时候难免需要一些用户名和密码,写个简单的Python小脚本批量生成一些 代码示例 import random,string #生成大小字母和数字一起的大字符串 a ...

  6. python批量生成SQL语句

    1,首先写一条能运行成功插入SQL的语句 INSERT INTO sign_guest(realname,phone,email,sign,event_id)VALUES("jack&quo ...

  7. Python项目生成requirements.txt文件及pip升级问题解决及流程

    缘由:新项目使用Python, PC上的python包不全,需要通过requirements.txt文件指定安装所需包 pip安装遇到一些坑 一.直接使用pip包管理工具生成requirements. ...

  8. java使用jdom生成xml格式文件

    本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...

  9. 批量生成xml文件数据C#实现

    方法一 // < Records count = "5" > //< Record > // < Contact_ID > 5 - 55W - ...

随机推荐

  1. shell学习(15)- eval及shell No such file or directory解决办法

    eval可以读取一连串的参数,然后按照参数特性来执行.参数数目不限,彼此之间用分号隔开. eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接 ...

  2. 【NS2】NS2修改MAC协议(转载)

    NS2版本:2.34   涉及NS2代码文件: ns-2.34/mac/channel.h ns-2.34/mac/channel.cc ns-2.34/mac/wireless-phyExt.h n ...

  3. Spring data jpa hibernate:查询异常java.sql.SQLException: Column '列名' not found

    使用spring boot,jap,hibernate不小心的错误: java.sql.SQLException: Column '列名' not found: 这句话的意思是:找不到此列 为什么会出 ...

  4. Java练习 SDUT-1689_斐波那契?

    斐波那契? Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 给出一个数列的递推公式,希望你能计算出该数列的第N个数.递推 ...

  5. CSDN-Java培训 - 看看这次会有多少人跟风...

    2019年5月8日,闲来无事(最近答辩还没事......),存个档. 看看这一波风口,记录互联网+教育.

  6. react项目安装及运行

    博客地址 :https://www.cnblogs.com/sandraryan/ 安装node ,有就跳过. node.js官网:https://nodejs.org/en/ 终端用node -v ...

  7. kuangbin专题-连通图A - Network of Schools

    这道题的意思是就是 问题 1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校 ...

  8. H3C 局域网的不足

  9. H3C 802.11无线网络的介质访问控制

  10. C#面向对象--练习题

    public class Program { //用户自定义:我们自己定义这种数据类型 public struct jiegouti// 结构体前面加上public, 可供外界访问 { public ...